C# Enumerable.Aggregate方法

官方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方法的用法,首先看這樣一個實例:api

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中除了第一項的每一項調用這個funcfunc第一次執行時,其第一個參數來自於數組中的第一項(做爲一個初始的聚合結果值),第二個參數來自於數組中的第二項。當func第二次執行時,其兩個參數分別來自於上一次func執行的結果以及數據中的當前遍歷項(也就是數組中的第三項),之後每次執行以此類推。當對數組中的最後一項執行完func以後,返回一個對集合數據進行咱們自定義聚合過程的聚合值。所以,EnumerableAggregate方法並不僅是用來求和(由於聚合過程咱們是能夠經過這個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方法還有這樣一種重載(注意它的聚合結果是能夠與集合中包含的數據類型不一樣的)this

public static TAccumulate Aggregate<TSource,TAccumulate> (this System.Collections.Generic.IEnumerable<TSource> sour
ce, TAccumulate seed, Func<TAccumulate,TSource,TAccumulate> func);

如下是對上面這種重載的使用介紹:code

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方法的返回類型是同樣的)。字符串

相關文章
相關標籤/搜索