int sum0 = 0;
for (int i = 0; i < 10; i++)
{
sum0 += i;
}
int sum1 = Enumerable.Range(0, 10).Sum();
int sum2 = Enumerable.Range(0, 10).Aggregate((x, y) => x + y);
int sum3 = Enumerable.Range(0, 10).Aggregate(0, (x, y) => x + y);
以上所有4个表达式都在做同样的事情:求0到10之和。我理解sum0和sum1的计算。但是sum2和sum3是什么?为什么lambda在这里使用两个参数(x,y)?
答案 0 :(得分:5)
扩展bdukes的回答,lambda采用
( x = [value of last lambda expression], y = [next value] ) => x+y
和sum3允许您设置初始x值。
答案 1 :(得分:3)
Enumerable.Aggregate
方法需要一个函数,它接受聚合的当前值和枚举中的值。 sum3
的重载也为聚合提供了起始值。
答案 2 :(得分:0)
X保持当前总数,为每个元素添加Y.
FOREACH(y)的 X = X + Y;
答案 3 :(得分:0)
Aggregate
扩展方法采用计算聚合的函数(Func<T1,T2,TResult>
)..
为sum2
指定的函数是为x
添加y
的函数,对于每个提供的x
和y
(即它将所有项目相加在列举中。)
sum3
的附加参数是一个累加器 - 一个要为每个操作添加的值 - 因为它是0,它基本上是对枚举中的所有项进行求和而没有任何附加值。
答案 4 :(得分:0)
sum2
使用自定义函数x + y
来聚合列表的每个元素。聚合以整数0
的默认值开始,并将第一个元素添加到它。然后它接受该值并添加下一个元素,依此类推,直到它耗尽元素。然后返回最终数字。
sum3
与sum2
完全相同,但它也明确地使用特定值0
开始聚合。
语义上所有三个都是相同的 - 如此处所示 - 但通过改变聚合函数和初始起始值,您可以生成各种自定义聚合。
另一种看待它的方式是.Sum()
只是.Aggregate(0, (x, y) => x + y);
的简写。
答案 5 :(得分:0)
x是“累积”值的变量,因此其值为
step 1) 1
step 2) 3
step 3) 6
step 4) 10
依旧......
sum3中的0是起始值:)(这是多余的,因为0是int的默认值)
答案 6 :(得分:0)
参数x包含聚合,y是下一个枚举项。
string sentence = "the quick brown fox jumps over the lazy dog";
// Split the string into individual words.
string[] words = sentence.Split(' ');
// Prepend each word to the beginning of the
// new sentence to reverse the word order.
string reversed = words.Aggregate((workingSentence, next) =>
next + " " + workingSentence);
Console.WriteLine(reversed);
// This code produces the following output:
//
// dog lazy the over jumps fox brown quick the