骨料
Aggregate
在序列上應用累加器函式。
int[] intList = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = intList.Aggregate((prevSum, current) => prevSum + current);
// sum = 55
- 第一步
prevSum = 1
- 在第二個
prevSum = prevSum(at the first step) + 2
- 在第 i 步
prevSum = prevSum(at the (i-1) step) + i-th element of the array
string[] stringList = { "Hello", "World", "!" };
string joinedString = stringList.Aggregate((prev, current) => prev + " " + current);
// joinedString = "Hello World !"
Aggregate
的第二次過載也接收 seed
引數,該引數是初始累加器值。這可用於計算集合上的多個條件,而無需多次迭代。
List<int> items = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
對於我們想要計算的 items
的集合
- 總
.Count
- 偶數的數量
- 收集每個專案
使用 Aggregate
可以這樣做:
var result = items.Aggregate(new { Total = 0, Even = 0, FourthItems = new List<int>() },
(accumelative,item) =>
new {
Total = accumelative.Total + 1,
Even = accumelative.Even + (item % 2 == 0 ? 1 : 0),
FourthItems = (accumelative.Total + 1)%4 == 0 ?
new List<int>(accumelative.FourthItems) { item } :
accumelative.FourthItems
});
// Result:
// Total = 12
// Even = 6
// FourthItems = [4, 8, 12]
請注意,使用匿名型別作為種子必須為每個專案例項化一個新物件,因為這些屬性是隻讀的。使用自定義類可以簡單地分配資訊,不需要 new
(僅在給出初始 seed
引數時)