这听起来有些la脚,但我一直无法找到关于的很好的解释Aggregate。
Aggregate
好的意味着简短,描述性的,全面的,并带有一个小而清晰的例子。
最容易理解的定义Aggregate是,它考虑到之前进行的操作,对列表的每个元素执行操作。也就是说,它在第一个和第二个元素上执行操作并将结果转发。然后,它对先前的结果和第三个元素进行运算并继续进行。等等
例子1.求和
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。
1
2
3
6
4
10
例子2.从一个字符串数组创建一个csv
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。等等。
a
b
a,b
c
a,b,c
例子3.使用种子乘数字
为了完整起见,Aggregate其中的重载带有种子值。
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个元素。
5
50
20
1000
附录
上面的示例2使用字符串连接来创建用逗号分隔的值列表。这是一种简单的方式来说明Aggregate此答案的目的,以供使用。但是,如果使用此技术实际创建大量逗号分隔的数据,则使用a会更合适StringBuilder,并且这与Aggregate使用种子重载来启动完全兼容StringBuilder。
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);
更新的示例:http : //rextester.com/YZCVXV6464