There is a collection:
List<Tuple<string, string, int>> sales = new List<Tuple<string, string, int>> {
Tuple.Create("Store 1", "Product 1", 1000),
Tuple.Create("Store 2", "Product 2", 2000),
Tuple.Create("Store 3", "Product 3", 1500),
Tuple.Create("Store 3", "Product 3", 10000)};
I'd like to get the tree:
Store 1, Product 1, 1000
Store 1, Product 1, 1000
Store 2, Product 2, 2000
Store 2, Product 2, 2000
Store 3, Product 3, 11500
Store 3, Product 3, 1500
Store 3, Product 3, 10000
I use this linq query to build the tree:
var group = from sale in sales
group sale by new { sale.Item1, sale.Item2 } into g
select new { g.Key.Item1, g.Key.Item2, Sum = g.Sum(e => e.Item3),nestedsales = (from s in g select s) };
and this code for output:
foreach (var e in group)
{
Console.WriteLine(e.Item1 + ", " + e.Item2 + ", " + e.Sum);
foreach(var sale in e.nestedsales )
{
Console.WriteLine('\t' + sale.Item1 + ", " + sale.Item2 + ", " + sale.Item3);
}
}
It works fine! I just wonder, is it optimal query? I mean, is it possible to build the tree without adding fourth field - nestedsales in the result of the query?
Yes , "nestedsales" is not necessary :
var group = sales.GroupBy(sale=>new { sale.Item1, sale.Item2 });
foreach (var e in group)
{
Console.WriteLine(e.Key.Item1 + ", " + e.Key.Item2 + ", " + e.Sum(t=>t.Item3));
foreach (var sale in e)
{
Console.WriteLine('\t' + sale.Item1 + ", " + sale.Item2 + ", " + sale.Item3);
}
}