今天做题,看题解有个大佬写了一个有意思的语句。其中用到了Aggregate,查了查百度也没学多少东西,鄙人又太笨,看了看官方文档也没看懂。就自己研究了一下,于此记录,以备复习之需。
先放一下原型(以int为例)
于是写一个程序来测试一下,观察结果
using System;
using System.Linq;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int[] myIntArray = { 1, 2, 3, 4, 5 };
int[] myIntArray2 = { 1, 2 };
int[] myIntArray3 = { 2, 1};
Console.WriteLine(myIntArray.Aggregate((paramA, paramB) => paramA + paramB));
Console.WriteLine(myIntArray.Aggregate((paramA, paramB) => paramA * 2 + paramB));
Console.WriteLine(myIntArray2.Aggregate((paramA, paramB) => paramA * 2 + paramB));
Console.WriteLine(myIntArray2.Aggregate((paramA, paramB) => 4 + paramB))
Console.WriteLine(myIntArray4.Aggregate((paramA, paramB) => 4 + paramB));
Console.WriteLine(myIntArray3.Aggregate((paramA, paramB) => 4 + paramB));
Console.ReadKey();
}
}
}
然后结果依次是:
15
57
4
6
7
5
可以从第一个输出得知,本例中累加器的作用确实是将元素依次相加(注:这里是因为我写的方法是相加,具体还可以是什么还要看自己怎么写,它只是将每个元素进行相同方法的操作)
我们可以大致进行两种假设:
- 对于这个匿名方法,paramA的值第一次是数组的第一个参数,之后每轮相加的结果保存在paramA,然后读取下一个数组元素保存在paramB.
- 对于这个匿名方法,paramA初始值为0(在int情况下,其他情况类推),随后数组的每个元素依次给paramB,执行这个匿名方法。
结合第四个和第五个输出可知,假设2并不正确
然后输出4和6进一步验证了假设1的可能性
依照假设1的思路计算输出2,计算结果与输出一致,过程如下:
(((1*2+2)*2+3)*2+4)*2+5=57
所以可以得出结论,Aggregate累加器接收到的第一个元素作为paramA,以后接收的元素都存在paramB与paramA进行运算,并且运算结果存在paramA中后与新的paramB进行下一轮计算。