聚合lambda表达式

时间:2010-06-30 14:57:16

标签: c# lambda

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)?

7 个答案:

答案 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的函数,对于每个提供的xy(即它将所有项目相加在列举中。)

sum3的附加参数是一个累加器 - 一个要为每个操作添加的值 - 因为它是0,它基本上是对枚举中的所有项进行求和而没有任何附加值。

答案 4 :(得分:0)

sum2使用自定义函数x + y来聚合列表的每个元素。聚合以整数0的默认值开始,并将第一个元素添加到它。然后它接受该值并添加下一个元素,依此类推,直到它耗尽元素。然后返回最终数字。

sum3sum2完全相同,但它也明确地使用特定值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

来自http://msdn.microsoft.com/en-us/library/bb548651.aspx