官方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方法的回傳型別是一樣的),
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/240301.html
標籤:.NET技术
