我正在努力想出最好的方法来解释我的确切问题,而不必有人必须解释Aggregate的作用,因为我知道这里已经深入探讨了这里和互联网上的其他地方。调用Aggregate()并使用linq语句(如
)时(a,b) => a+b
什么是b,什么是b?我知道a是当前的元素,但是b是什么?我已经看到了一些示例,其中b似乎只是一个元素,而在其他示例中,它似乎是前一个函数和其他示例的结果,其中b似乎是前一个函数的结果。
我在这里查看了实际C#文档页面上的示例 http://msdn.microsoft.com/en-us/library/bb548744.aspx 和这里 http://www.dotnetperls.com/aggregate
但我只需要澄清linq表达式中两个参数之间的区别。如果我错过了一些基本的Linq知识来回答这个问题,请随意把我放在我的位置。
答案 0 :(得分:5)
查看http://msdn.microsoft.com/en-us/library/bb548651.aspx
上的示例 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
在此示例中,传递给Aggregate
的匿名函数为(workingSentence, next) => next + " " + workingSentence
。 a
将workingSentence
包含直到当前元素的聚合结果,b
将是添加到聚合的当前元素。在第一次调用匿名函数workingSentence = ""
和next = "the"
时。在下一个电话中,workingSentence = "the"
和next = "quick"
。
答案 1 :(得分:4)
如果你正在调用匹配该描述的Func的重载,那么你最有可能使用这个版本:
这意味着a
将成为您的累加器,而b
将是下一个可以使用的元素。
someEnumerable.Aggregate((a,b) => a & b);
如果你要将它扩展到常规循环,它可能看起来像:
Sometype a = null;
foreach(var b in someEnumerable)
{
if(a == null)
{
a = b;
}
else
{
a = a & b;
}
}
将执行按位 - 并将结果存储回累加器。
答案 2 :(得分:3)
a
不是当前元素 - b
是。第一次调用lambda表达式时,a
将等于您为seed
提供的Aggregate
参数。每个后续时间它将等于上一次调用lambda表达式的结果。