using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
List<Destination> destinations = new List<Destination>() {
new Destination() { A = 1, B = 1 },
new Destination() { A = 1, B = 2 },
new Destination() { A = 2, B = 1 }
};
List<Source> sources = new List<Source>() {
new Source() { A = 1, B = 1, C = "a" },
new Source() { A = 2, B = 1, C = "b" },
new Source() { A = 2, B = 1, C = "c" },
new Source() { A = 1, B = 1, C = "d" },
new Source() { A = 2, B = 2, C = "e" }
};
var lookup = sources.ToLookup(s => new { s.A, s.B }, s => s.C);
foreach (var d in destinations)
d.Cs = lookup[new { d.A, d.B }].ToList();
// results
Console.WriteLine("A B Cs");
foreach(var d in destinations)
{
Console.WriteLine("{0}-{1}: {2}", d.A, d.B, String.Join(",", d.Cs.Cast<string>().ToArray()));
}
}
}
class Source
{
public object A { get; set; }
public object B { get; set; }
public object C { get; set; }
}
class Destination
{
public object A { get; set; }
public object B { get; set; } // (A,B) is a unique key
public List<object> Cs { get; set; }
public object D { get; set; }
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CiAgICAgICAgICAgIExpc3Q8RGVzdGluYXRpb24+IGRlc3RpbmF0aW9ucyA9IG5ldyBMaXN0PERlc3RpbmF0aW9uPigpIHsKICAgICAgICAgICAgICAgIG5ldyBEZXN0aW5hdGlvbigpIHsgQSA9IDEsIEIgPSAxIH0sCiAgICAgICAgICAgICAgICBuZXcgRGVzdGluYXRpb24oKSB7IEEgPSAxLCBCID0gMiB9LAogICAgICAgICAgICAgICAgbmV3IERlc3RpbmF0aW9uKCkgeyBBID0gMiwgQiA9IDEgfQogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgTGlzdDxTb3VyY2U+IHNvdXJjZXMgPSBuZXcgTGlzdDxTb3VyY2U+KCkgewogICAgICAgICAgICAgICAgbmV3IFNvdXJjZSgpIHsgQSA9IDEsIEIgPSAxLCBDID0gImEiIH0sCiAgICAgICAgICAgICAgICBuZXcgU291cmNlKCkgeyBBID0gMiwgQiA9IDEsIEMgPSAiYiIgfSwKICAgICAgICAgICAgICAgIG5ldyBTb3VyY2UoKSB7IEEgPSAyLCBCID0gMSwgQyA9ICJjIiB9LAogICAgICAgICAgICAgICAgbmV3IFNvdXJjZSgpIHsgQSA9IDEsIEIgPSAxLCBDID0gImQiIH0sCiAgICAgICAgICAgICAgICBuZXcgU291cmNlKCkgeyBBID0gMiwgQiA9IDIsIEMgPSAiZSIgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGxvb2t1cCA9IHNvdXJjZXMuVG9Mb29rdXAocyA9PiBuZXcgeyBzLkEsIHMuQiB9LCBzID0+IHMuQyk7CiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIGRlc3RpbmF0aW9ucykgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGQuQ3MgPSBsb29rdXBbbmV3IHsgZC5BLCBkLkIgfV0uVG9MaXN0KCk7CgogICAgICAgICAgICAvLyByZXN1bHRzCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJBIEIgIENzIik7CiAgICAgICAgICAgIGZvcmVhY2godmFyIGQgaW4gZGVzdGluYXRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9LXsxfTogezJ9IiwgZC5BLCBkLkIsIFN0cmluZy5Kb2luKCIsIiwgZC5Dcy5DYXN0PHN0cmluZz4oKS5Ub0FycmF5KCkpKTsKICAgICAgICAgICAgfQoJfQp9CgpjbGFzcyBTb3VyY2UKewogICAgcHVibGljIG9iamVjdCBBIHsgZ2V0OyBzZXQ7IH0KICAgIHB1YmxpYyBvYmplY3QgQiB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgb2JqZWN0IEMgeyBnZXQ7IHNldDsgfQp9CgpjbGFzcyBEZXN0aW5hdGlvbgp7CiAgICBwdWJsaWMgb2JqZWN0IEEgeyBnZXQ7IHNldDsgfQogICAgcHVibGljIG9iamVjdCBCIHsgZ2V0OyBzZXQ7IH0gLy8gKEEsQikgaXMgYSB1bmlxdWUga2V5CiAgICBwdWJsaWMgTGlzdDxvYmplY3Q+IENzIHsgZ2V0OyBzZXQ7IH0KICAgIHB1YmxpYyBvYmplY3QgRCB7IGdldDsgc2V0OyB9Cn0=