2011-04-07 146 views
2

我有一个简单的LINQ问题:LINQ化合物聚合

我有一个FooBars的集合。 Foobar酒店拥有foo酒店和酒吧。 我想汇总foo和bar而不用通过我的foobar集合多次运行。

即,我想要的东西相当于SQL:

SELECT SUM(Foo), SUM(Bar) From FooBars 

int fooSum, barSum; 
foreach (var foobar in foobars) 
{ 
    fooSum += foobar.Foo; 
    barSum += foobar.Bar; 
} 

是否有与化合物写在LINQ选择(或类似),优雅的方式?

回答

4

您可以使用Aggregate,以匿名类型或元组保存运行总数。虽然我可能会自己去一个简单的foreach循环。

var result = foobars.Aggregate(new { FooSum = 0, BarSum = 0 }, 
           (a, x) => new { 
               FooSum = a.FooSum + x.Foo, 
               BarSum = a.BarSum + x.Bar 
              }); 

Console.WriteLine("FooSum=" + result.FooSum + ", BarSum=" + result.BarSum); 
+0

正是我在找的东西。谢谢。 – Holstebroe 2011-04-07 12:44:09

+0

@LukeH:当foobars包含很多元素时,它会不会创建大对象开销,因为您正在为每次迭代创建一个匿名类型的新实例? – 2011-04-07 12:58:52

+0

@Daniel:是的,确实如此,如果你也使用过类似“Tuple ”的东西,它们也适用,因为它们也是ref类型。我想你可以创建一个自定义的结构来完成这个工作,或者(错误地)使用一个内建的结构体,比如'KeyValuePair '。我想你也可以使用'int [2]''作为累加器,并在每次迭代时改变它。有了这些建议,它变得非常糟糕,一个'foreach'循环肯定是更好的选择。 – LukeH 2011-04-07 13:03:48