小编典典

LINQ 聚合算法解释

all

这可能听起来很蹩脚,但我一直无法找到一个很好的解释Aggregate

好意味着简短、描述性、全面,并带有一个小而清晰的例子。


阅读 114

收藏
2022-03-02

共1个答案

小编典典

最容易理解的定义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)

这增加了12使3. 然后将3(previous 的结果) 和3(next element in sequence) 添加到 make
6。然后添加64使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. 等等。

示例 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 个元素。

实时示例:http
://rextester.com/ZXZ64749 文档:http: //msdn.microsoft.com/en-
us/library/bb548651.aspx


附录

上面的示例 2 使用字符串连接来创建由逗号分隔的值列表。这是一种简单的方式来解释使用Aggregatewhich
是此答案的意图。但是,如果使用这种技术来实际创建大量逗号分隔的数据,则使用 a
会更合适StringBuilder,这与Aggregate使用种子重载启动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

2022-03-02