using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
class B
{
public string Country { get; set; }
public string Article { get; set; }
public string Category { get; set; }
}
class D
{
public int Price { get; set; }
public string Store { get; set; }
public string Article { get; set; }
}
class E
{
public string Store { get; set; }
public string Article { get; set; }
public string ConsumerCode { get; set; }
}
static void Main()
{
List<B> sequenceB = new List<B>
{
new B { Country = "Germany", Article = "A1", Category = "Tech" },
new B { Country = "USA", Article = "A2", Category = "Gadget" },
new B { Country = "Japan", Article = "A3", Category = "Tech" }
};
List<D> sequenceD = new List<D>
{
new D { Price = 100, Store = "Shop1", Article = "A1" },
new D { Price = 200, Store = "Shop2", Article = "A2" },
new D { Price = 150, Store = "Shop1", Article = "A3" }
};
List<E> sequenceE = new List<E>
{
new E { Store = "Shop1", Article = "A1", ConsumerCode = "C1" },
new E { Store = "Shop1", Article = "A3", ConsumerCode = "C2" },
new E { Store = "Shop2", Article = "A2", ConsumerCode = "C3" }
};
var result = from e in sequenceE
join d in sequenceD on e.Article equals d.Article
join b in sequenceB on d.Article equals b.Article
group d.Price by new { e.Store, b.Country } into g
select new
{
Store = g.Key.Store,
Country = g.Key.Country,
TotalPrice = g.Sum()
};
var allPairs = from e in sequenceE.Select(x => x.Store).Distinct()
from b in sequenceB.Select(x => x.Country).Distinct()
join r in result on new { Store = e, Country = b } equals new { r.Store, r.Country } into gj
from r in gj.DefaultIfEmpty()
orderby e, b
select new
{
Store = e,
Country = b,
TotalPrice = r?.TotalPrice ?? 0
};
foreach (var item in allPairs)
{
Console.WriteLine($"{item.Store} {item.Country} {item.TotalPrice}");
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpjbGFzcyBQcm9ncmFtCnsKICAgIGNsYXNzIEIKICAgIHsKICAgICAgICBwdWJsaWMgc3RyaW5nIENvdW50cnkgeyBnZXQ7IHNldDsgfQogICAgICAgIHB1YmxpYyBzdHJpbmcgQXJ0aWNsZSB7IGdldDsgc2V0OyB9CiAgICAgICAgcHVibGljIHN0cmluZyBDYXRlZ29yeSB7IGdldDsgc2V0OyB9CiAgICB9CgogICAgY2xhc3MgRAogICAgewogICAgICAgIHB1YmxpYyBpbnQgUHJpY2UgeyBnZXQ7IHNldDsgfQogICAgICAgIHB1YmxpYyBzdHJpbmcgU3RvcmUgeyBnZXQ7IHNldDsgfQogICAgICAgIHB1YmxpYyBzdHJpbmcgQXJ0aWNsZSB7IGdldDsgc2V0OyB9CiAgICB9CgogICAgY2xhc3MgRQogICAgewogICAgICAgIHB1YmxpYyBzdHJpbmcgU3RvcmUgeyBnZXQ7IHNldDsgfQogICAgICAgIHB1YmxpYyBzdHJpbmcgQXJ0aWNsZSB7IGdldDsgc2V0OyB9CiAgICAgICAgcHVibGljIHN0cmluZyBDb25zdW1lckNvZGUgeyBnZXQ7IHNldDsgfQogICAgfQoKICAgIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIExpc3Q8Qj4gc2VxdWVuY2VCID0gbmV3IExpc3Q8Qj4KICAgICAgICB7CiAgICAgICAgICAgIG5ldyBCIHsgQ291bnRyeSA9ICJHZXJtYW55IiwgQXJ0aWNsZSA9ICJBMSIsIENhdGVnb3J5ID0gIlRlY2giIH0sCiAgICAgICAgICAgIG5ldyBCIHsgQ291bnRyeSA9ICJVU0EiLCBBcnRpY2xlID0gIkEyIiwgQ2F0ZWdvcnkgPSAiR2FkZ2V0IiB9LAogICAgICAgICAgICBuZXcgQiB7IENvdW50cnkgPSAiSmFwYW4iLCBBcnRpY2xlID0gIkEzIiwgQ2F0ZWdvcnkgPSAiVGVjaCIgfQogICAgICAgIH07CgogICAgICAgIExpc3Q8RD4gc2VxdWVuY2VEID0gbmV3IExpc3Q8RD4KICAgICAgICB7CiAgICAgICAgICAgIG5ldyBEIHsgUHJpY2UgPSAxMDAsIFN0b3JlID0gIlNob3AxIiwgQXJ0aWNsZSA9ICJBMSIgfSwKICAgICAgICAgICAgbmV3IEQgeyBQcmljZSA9IDIwMCwgU3RvcmUgPSAiU2hvcDIiLCBBcnRpY2xlID0gIkEyIiB9LAogICAgICAgICAgICBuZXcgRCB7IFByaWNlID0gMTUwLCBTdG9yZSA9ICJTaG9wMSIsIEFydGljbGUgPSAiQTMiIH0KICAgICAgICB9OwoKICAgICAgICBMaXN0PEU+IHNlcXVlbmNlRSA9IG5ldyBMaXN0PEU+CiAgICAgICAgewogICAgICAgICAgICBuZXcgRSB7IFN0b3JlID0gIlNob3AxIiwgQXJ0aWNsZSA9ICJBMSIsIENvbnN1bWVyQ29kZSA9ICJDMSIgfSwKICAgICAgICAgICAgbmV3IEUgeyBTdG9yZSA9ICJTaG9wMSIsIEFydGljbGUgPSAiQTMiLCBDb25zdW1lckNvZGUgPSAiQzIiIH0sCiAgICAgICAgICAgIG5ldyBFIHsgU3RvcmUgPSAiU2hvcDIiLCBBcnRpY2xlID0gIkEyIiwgQ29uc3VtZXJDb2RlID0gIkMzIiB9CiAgICAgICAgfTsKCiAgICAgICAgdmFyIHJlc3VsdCA9IGZyb20gZSBpbiBzZXF1ZW5jZUUKICAgICAgICAgICAgICAgICAgICAgam9pbiBkIGluIHNlcXVlbmNlRCBvbiBlLkFydGljbGUgZXF1YWxzIGQuQXJ0aWNsZQogICAgICAgICAgICAgICAgICAgICBqb2luIGIgaW4gc2VxdWVuY2VCIG9uIGQuQXJ0aWNsZSBlcXVhbHMgYi5BcnRpY2xlCiAgICAgICAgICAgICAgICAgICAgIGdyb3VwIGQuUHJpY2UgYnkgbmV3IHsgZS5TdG9yZSwgYi5Db3VudHJ5IH0gaW50byBnCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXcKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmUgPSBnLktleS5TdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgPSBnLktleS5Db3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxQcmljZSA9IGcuU3VtKCkKICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgdmFyIGFsbFBhaXJzID0gZnJvbSBlIGluIHNlcXVlbmNlRS5TZWxlY3QoeCA9PiB4LlN0b3JlKS5EaXN0aW5jdCgpCiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiIGluIHNlcXVlbmNlQi5TZWxlY3QoeCA9PiB4LkNvdW50cnkpLkRpc3RpbmN0KCkKICAgICAgICAgICAgICAgICAgICAgICBqb2luIHIgaW4gcmVzdWx0IG9uIG5ldyB7IFN0b3JlID0gZSwgQ291bnRyeSA9IGIgfSBlcXVhbHMgbmV3IHsgci5TdG9yZSwgci5Db3VudHJ5IH0gaW50byBnagogICAgICAgICAgICAgICAgICAgICAgIGZyb20gciBpbiBnai5EZWZhdWx0SWZFbXB0eSgpCiAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJieSBlLCBiCiAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5ldwogICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmUgPSBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5ID0gYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxQcmljZSA9IHI/LlRvdGFsUHJpY2UgPz8gMAogICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGFsbFBhaXJzKQogICAgICAgIHsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJ7aXRlbS5TdG9yZX0ge2l0ZW0uQ291bnRyeX0ge2l0ZW0uVG90YWxQcmljZX0iKTsKICAgICAgICB9CiAgICB9Cn0=