Aggregate
最容易理解的定义是,它对列表中的每个元素执行一个操作,同时考虑到之前进行的操作.也就是说,它对第一个和第二个元素执行操作,并将结果向前推进.然后,它对前一个结果和第三个元素进行运算,并向前推进.等.
Example 1. Summing numbers
var nums = new[]{1,2,3,4};
var sum = nums.Aggregate( (a,b) => a + b);
Console.WriteLine(sum); // output: 10 (1+2+3+4)
把1
加2
等于3
.然后将3
(上一个元素的结果)和3
(序列中的下一个元素)相加,得出6
.然后将6
和4
相加得到10
.
Example 2. create a csv from an array of strings
var chars = new []{"a","b","c", "d"};
var csv = chars.Aggregate( (a,b) => a + ',' + b);
Console.WriteLine(csv); // Output a,b,c,d
这是以大致相同的方式工作的.将a
连接成逗号和b
连接成a,b
.然后将a,b
与逗号连接,并将c
连接成a,b,c
.诸若此类.
Example 3. Multiplying numbers using a seed个
为了完整性,Aggregate
中有overload取种子值.
var multipliers = new []{10,20,30,40};
var multiplied = multipliers.Aggregate(5, (a,b) => a * b);
Console.WriteLine(multiplied); //Output 1200000 ((((5*10)*20)*30)*40)
与上面的例子非常相似,它从值5
开始,然后乘以序列10
的第一个元素,得到结果50
.该结果被向前推进,并与序列20
中的下一个数字相乘,得到结果1000
.这将持续到序列的剩余2个元素.
活生生的例子:http://rextester.com/ZXZ64749
Addendum
上面的示例2使用字符串连接创建一个由逗号分隔的值列表.这是一个简单的方式来解释Aggregate
的使用,这是这个答案的意图.然而,如果使用这种技术来实际创建大量逗号分隔的数据,则更适合使用StringBuilder
,这与Aggregate
使用种子重载来启动StringBuilder
完全兼容.
var chars = new []{"a","b","c", "d"};
var csv = chars.Aggregate(new StringBuilder(), (a,b) => {
if(a.Length>0)
a.Append(",");
a.Append(b);
return a;
});
Console.WriteLine(csv);