官方doc地址:'https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.aggregate?view=net-5.0#System_Linq_Enumerable_Aggregate__1_System_Collections_Generic_IEnumerable___0__System_Func___0___0___0__',首先,根據字面意思進行理解,Aggregate在英文中表示‘合計,聚合’意思,從這個角度出發,我們進一步探究Aggregate方法的用法,首先看這樣一個實例:
private static void Main(string[] args)
{
int[] testArray = new[] {1, 2, 3, 4, 5};
var aggragateResult = testArray.Aggregate((tempAggregatedVal, next) => tempAggregatedVal += next);
Console.WriteLine(aggragateResult);
Console.Read();
}
在上面的這個實例中,我們將數組testArray中的每一項進行了合並求和,至於Aggravate方法的工作過程 ,我個人根據微軟官方doc的理解如下:Arrragate方法的參數是一個func,它會對testArray中除了第一項的每一項調用這個func。當func第一次執行時,其第一個參數來自於數組中的第一項(作為一個初始的聚合結果值),第二個參數來自於數組中的第二項。當func第二次執行時,其兩個參數分別來自於上一次func執行的結果以及數據中的當前遍歷項(也就是數組中的第三項),以后每次執行以此類推。當對數組中的最后一項執行完func之后,返回一個對集合數據進行我們自定義聚合過程的聚合值。因此,Enumerable的Aggregate方法並不只是用來求和(因為聚合過程我們是可以通過這個func進行自定義的),比如我們可以對一句話進行倒置:
private static void Main(string[] args)
{
string testStr = "A B C D E F G";
string[] strAry = testStr.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
var aggregateResult = strAry.Aggregate((tempAggregatedVal, next) => next += tempAggregatedVal);
Console.WriteLine(aggregateResult);
Console.Read();
}
上面的打印結果為:GFEDCBA。
在上面的使用方式中,我們的數組包含的元素(或者宏觀上說IEnumerable<T>)是什么類型,那么對其調用Aggregate方法之后返回的聚合結果就是就是什么類型(也就是IEnumerable<T>中的T類型),但是,Aggregate方法還有另外的兩種重載,上面只是其中的一種重載。
在微軟的官方doc中,Aggregate方法還有這樣一種重載(注意它的聚合結果是可以與集合中包含的數據類型不同的):
public static TAccumulate Aggregate<TSource,TAccumulate> (this System.Collections.Generic.IEnumerable<TSource> sour
ce, TAccumulate seed, Func<TAccumulate,TSource,TAccumulate> func);
以下是對上面這種重載的使用介紹:
private static void Main(string[] args)
{
int[] testArray = new[] {1, 2, 3, 4, 5};
string aggragateResult = testArray.Aggregate(string.Empty,(tempAggregatedVal, next) => tempAggregatedVal += next.ToString());
Console.WriteLine($"聚合結果為{aggragateResult}");
}
在這種重載中,我們可以顯式指定初始的聚合結果值(也就是指定對上例中數組中的各項進行聚合操作前tempAggregatedVal的初始值),同時因為我們已經顯式指定了初始的聚合結果值,因此和之前的例子不同的地方就在於數組中的第一項不再作為初始的聚合結果值,同時數組的聚合操作是針對數組中的第一項開始的(之前都是從第二項開始的,第一項作為初始的聚合操作結果值),在上面的例子中,最后的打印結果是一個字符串類型的‘12345’。在這種重載下,要判斷Aggregate方法的返回結果類型可以根據Aggregate方法的第一個參數類型進行判斷(因為從方法簽名來看其與Aggregate方法的返回類型是一樣的)。
