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

好的意思是简短,描述性的,全面的,并有一个小而清晰的例子.

推荐答案

Aggregate最容易理解的定义是,它对列表中的每个元素执行一个操作,同时考虑到之前进行的操作.也就是说,它对第一个和第二个元素执行操作,并将结果向前推进.然后,它对前一个结果和第三个元素进行运算,并向前推进.等.

Example 1. Summing numbers

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(上一个元素的结果)和3(序列中的下一个元素)相加,得出6.然后将64相加得到10.

Example 2. create a csv from an array of strings

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.诸若此类.

Example 3. Multiplying numbers using a seed

为了完整性,Aggregate中有overload取种子值.

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


Addendum

上面的示例2使用字符串连接创建一个由逗号分隔的值列表.这是一个简单的方式来解释Aggregate的使用,这是这个答案的意图.然而,如果使用这种技术来实际创建大量逗号分隔的数据,则更适合使用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

.net相关问答推荐

StackExchange.Redis和NRedisStack包有什么不同?

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

CustomControl 计算自己的宽度和高度 - 使用 bounds.Height=0 调用 ArrangeOverride

为什么 .net 对字符串使用 UTF16 编码,但默认使用 UTF-8 来保存文件?

无法加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 1.1.0.0

如何从控制台应用程序中的 Task.WaitAll() 获取返回值?

根源是什么?

如何从标头中检索基本身份验证凭据?

找不到 Microsoft.Office.Interop Visual Studio

从 Web.Config 中的邮箱友好显示名称存储 Smtp

在 .NET 中计算目录大小的最佳方法是什么?

将字典值转换为数组

判断对象列表是否包含具有特定值的属性

如何在 C# 中处理 XML

忽略 LINQ to XML 中的命名空间

如何将 .NET 应用程序编译为本机代码?

任何人都知道缺少枚举通用约束的好方法吗?

.NET 中的 java.lang.IllegalStateException?

浮动与双重性能

在类型 c# 上切换大小写