using System;
using System.Linq;
public class Pet
{
public string Name { get; set; }
public string Type { get; set; }
public string Owner { get; set; }
}
public class Owner
{
public string Name { get; set; }
public string Country { get; set; }
}
public class Test
{
public static void Main()
{
Pet[] pets =
{
new Pet() { Name = "Vasya", Type = "Cat", Owner = "John" },
new Pet() { Name = "Borya", Type = "Dog", Owner = "Dean" },
new Pet() { Name = "Kim", Type = "Hedgehog", Owner = "Mary" },
new Pet() { Name = "Joka", Type = "Dog", Owner = "John" },
new Pet() { Name = "Mursick", Type = "Cat", Owner = "Dean" },
new Pet() { Name = "Mick", Type = "Cat", Owner = "Mary" },
new Pet() { Name = "John", Type = "Hedgehog", Owner = "John" },
new Pet() { Name = "Jynx", Type = "Dog", Owner = "Dean" }
};
Owner[] owners =
{
new Owner() { Name = "John", Country = "USA" },
new Owner() { Name = "Mary", Country = "Switzerland" },
new Owner() { Name = "Dean", Country = "Great Britain" }
};
var el = from o in owners
join p in pets
on o.Name equals p.Owner
group p by new {o.Country, p.Type}
into grp select new { Country = grp.Key.Country, Type = grp.Key.Type, Count = grp.Count() };
foreach(var e in el) {
Console.WriteLine(e.Country + " "+ e.Type+" "+e.Count);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKCnB1YmxpYyBjbGFzcyBQZXQKewogICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KICAgIHB1YmxpYyBzdHJpbmcgVHlwZSB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgc3RyaW5nIE93bmVyIHsgZ2V0OyBzZXQ7IH0KfQoKcHVibGljIGNsYXNzIE93bmVyCnsKICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgc3RyaW5nIENvdW50cnkgeyBnZXQ7IHNldDsgfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgIHsKCQoJUGV0W10gcGV0cyA9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5ldyBQZXQoKSB7IE5hbWUgPSAiVmFzeWEiLCBUeXBlID0gIkNhdCIsIE93bmVyID0gIkpvaG4iIH0sCiAgICAgICAgICAgICAgICBuZXcgUGV0KCkgeyBOYW1lID0gIkJvcnlhIiwgVHlwZSA9ICJEb2ciLCBPd25lciA9ICJEZWFuIiB9LAogICAgICAgICAgICAgICAgbmV3IFBldCgpIHsgTmFtZSA9ICJLaW0iLCBUeXBlID0gIkhlZGdlaG9nIiwgT3duZXIgPSAiTWFyeSIgfSwKICAgICAgICAgICAgICAgIG5ldyBQZXQoKSB7IE5hbWUgPSAiSm9rYSIsIFR5cGUgPSAiRG9nIiwgT3duZXIgPSAiSm9obiIgfSwKICAgICAgICAgICAgICAgIG5ldyBQZXQoKSB7IE5hbWUgPSAiTXVyc2ljayIsIFR5cGUgPSAiQ2F0IiwgT3duZXIgPSAiRGVhbiIgfSwKICAgICAgICAgICAgICAgIG5ldyBQZXQoKSB7IE5hbWUgPSAiTWljayIsIFR5cGUgPSAiQ2F0IiwgT3duZXIgPSAiTWFyeSIgfSwKICAgICAgICAgICAgICAgIG5ldyBQZXQoKSB7IE5hbWUgPSAiSm9obiIsIFR5cGUgPSAiSGVkZ2Vob2ciLCBPd25lciA9ICJKb2huIiB9LAogICAgICAgICAgICAgICAgbmV3IFBldCgpIHsgTmFtZSA9ICJKeW54IiwgVHlwZSA9ICJEb2ciLCBPd25lciA9ICJEZWFuIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgCiAgICAgICAgICAgIE93bmVyW10gb3duZXJzID0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV3IE93bmVyKCkgeyBOYW1lID0gIkpvaG4iLCBDb3VudHJ5ID0gIlVTQSIgfSwKICAgICAgICAgICAgICAgIG5ldyBPd25lcigpIHsgTmFtZSA9ICJNYXJ5IiwgQ291bnRyeSA9ICJTd2l0emVybGFuZCIgfSwKICAgICAgICAgICAgICAgIG5ldyBPd25lcigpIHsgTmFtZSA9ICJEZWFuIiwgQ291bnRyeSA9ICJHcmVhdCBCcml0YWluIiB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZWwgPSBmcm9tIG8gaW4gb3duZXJzCiAgICAgICAgICAgICAgICBqb2luIHAgaW4gcGV0cwogICAgICAgICAgICAgICAgICAgIG9uIG8uTmFtZSBlcXVhbHMgcC5Pd25lcgogICAgICAgICAgICAgICAgZ3JvdXAgcCBieSBuZXcge28uQ291bnRyeSwgcC5UeXBlfQogICAgICAgICAgICAgICAgaW50byBncnAgc2VsZWN0IG5ldyB7IENvdW50cnkgPSBncnAuS2V5LkNvdW50cnksIFR5cGUgPSBncnAuS2V5LlR5cGUsIENvdW50ID0gZ3JwLkNvdW50KCkgfTsKIAogICAgICAgICAgICBmb3JlYWNoKHZhciBlIGluIGVsKSB7CgkgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5Db3VudHJ5ICsgIiAgIisgZS5UeXBlKyIgICIrZS5Db3VudCk7CQoJfQogICAgICB9Cn0=