2011-04-07 180 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