程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#擴展方法Aggregate擴展其改進

c#擴展方法Aggregate擴展其改進

編輯:C#入門知識

Enumerable.Aggregate 擴展方法在System.Linq命名空間中,是Enumerable類的第一個方法(按字母順序排名),但確是Enumerable裡面相對復雜的方法。
MSDN對它的說明是:對序列應用累加器函數。備注中還有一些說明,大意是這個方法比較復雜,一般情況下用Sum、Max、Min、Average就可以了。
看看下面的代碼,有了Sum,誰還會用Aggregate呢!

也很簡單吧,就是一個循環!前面lambda表達式中參數a, n 分別對應current, enumerator.Current,對照一下,還是很好理解的。

現在我們想求整數數組中位置為偶數的數的和(間隔求和),可以用Where配合Sum:

        public static void Test5()
        {
            int[] nums = new int[] { 10, 20, 30, 40, 50 };
            int sum1 = nums.Where((n, i) => i % 2 == 0).Sum();//10 + 30 + 50
        }

這個Where擴展設計的很好,它不但能帶出某項的值“n”,還能帶出項的位置“i”。
Aggregate可不行!我們來改進一下:

        //改進的Aggerate擴展(示例代碼,實際使用請添加空值檢查)
        public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, int, TSource> func)
        {
            int index = 0;
            using (IEnumerator<TSource> enumerator = source.GetEnumerator())
            {
                enumerator.MoveNext();
                index++;
                TSource current = enumerator.Current;
                while (enumerator.MoveNext())
                    current = func(current, enumerator.Current, index++);
                return current;
            }
        }

改進後的Aggregate更加強大,前面的求偶數位置數和的算法可以寫成下面的樣子:

        public static void Test6()
        {
            int[] nums = new int[]&nbs

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved