<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C# 中奇妙的函數–6. 五個序列聚合運算(Sum, Average, Min, Max,Aggregate)

      今天,我們將著眼于五個用于序列的聚合運算。很多時候當我們在對序列進行操作時,我們想要做基于這些序列執行某種匯總然后,計算結果。

       

      Enumerable 靜態類的LINQ擴展方法可以做到這一點 。就像之前大多數的LINQ擴展方法一樣,這些是基于IEnumerable <TSource>序列的操作。

      SUM() - 計算整個序列的總和

      它有兩種形式:

      • SUM(
        • 計算整個序列的總值。
        • 源類型必須是以下類型之一: int,long,double,decimalsingle 或這些類型的可空變種(int?, long?, double?…) 。
      • Sum(Func<TSource, X> projection)
        • 計算序列投影值的和。
        • 從MSDN上,我們得知X必須是以下類型之一:int,long,double,decimalsingle 或這些類型的可空變種(int?, long?, double?…) 。

       

      在這里請注意幾件事情。

       

      首先,盡管在C#中支持許多類型,SUM()方法-非投影式-只支持int,long,double,decimalsingle 。  

       

      1: // 正確

      2: double[] data = { 3.14, 2.72, 1.99, 2.32 };

      3: var result = data.Sum();

      4:

      5: //不支持

      6: short[] shortData = { 1, 2, 5, 7 };

      7:

      8: // 出現編輯錯誤

      9: var shortResult = shortData.Sum();

      還要注意的是,你可以操作上面這些類型允許Null 的可空值變種。在之前我們討論過,可為空的類型可以是一個棘手的事情,但用SUM()時我們不用擔心,因為所有的空值在求和時都排除了 :

       

      var data = new List<int?> { 1, 3, 9, 13, null, 7, 12, null };
      var result = data.Sum();

         
      第二,投影形式是一個比較有趣和有用的方法:
       

      為了說明這一點,讓我們假設一個簡單的POCO Employee:

       

       

      public sealed class Employee

      {

      public string Name { get; set; }

      public double Salary { get; set; }

      public short Dependents { get; set; }

      }


       


      var employees = new List<Employee>

      {

      new Employee { Name = "Bob", Salary = 35000.00, Dependents = 0 },

      new Employee { Name = "Sherry", Salary = 75250.00, Dependents = 1 },

      new Employee { Name = "Kathy", Salary = 32000.50, Dependents = 0 },

      new Employee { Name = "Joe", Salary = 17500.00, Dependents = 2 },

      };

       

      然后我們就可以使用投影方式獲得Salary 的總值:

       
      var totalSalary = employees.Sum(e => e.Salary);
       
      雖然投影形式表面上似乎被限制在了上述的類型里(int,long,single,double,decimal),但是如果我們使用lambda表達式或匿名表達,投影的形式將允許較短的類型:
       
      employees.Sum(e => e.Dependents);

      employees.Sum(delegate(Employee e) { return e.Dependents; });
       
      這是因為lambda表達式和匿名委托的結果可以自動擴大小數值類型(如 short)到 int。
       

      Average() - 返回序列的平均值

      Average()方法,就像SUM()一樣,只不過它是用總和除以實際涉及到的項目數。涉及到的是什么意思?請記住,SUM( )不包括空值 。Average()是將所有非null值求平均。例如:

       

       

      var intList = new int?[] { 10, 20, 30, null };



      // 返回 20

      Console.WriteLine(intList.Average());

       

      MIN() - 返回最小的序列值

      MIN()擴展方法用于研究序列,并返回從它的最小值  :

      • Min()
        • 查找序列中最小的值。
        • 拋出異常,如果沒有實現IComparableIComparable<T>
        • 拋出異常,如果序列是空的,源類型是值類型。
        • 如果序列是空的,X是引用類型或者Nullable的值類型,則返回 null 。
      • Min(Func<TSource, X> projection)
        • 返回泛型序列中的最小值
        • 如果 TSource 類型實現 IComparable<T>,則此方法使用該實現比較值。 否則,如果 TSource 類型實現 IComparable,則使用該實現比較值。
        • 拋出異常,如果序列是空的,X是值類型。
        • 如果 TSource 為引用類型,且源序列為空或僅包含為 null 的值,則此函數返回 null。

           

      MIN()支持幾乎任何類型,只要該類型實現IComparableIComparable <T>。因此,它是不限制的數值類型,可以用于任何比較的對象(包括像值類型的DateTime,TimeSpan):

       

       

      var shortList = new short[] { 1, 3, 7, 9, -9, 33 };

      // 返回 -9

      var smallest = shortList.Min();


      // 根據家庭成員數量找到最小值

      var minDependents = employees.Min(e => e.Dependents);

       
      此外,MIN()不使用泛型約束限制那些支持IComparable 接口的類型參數。相反,它拋出一個運行異常來回應如果序列非空,沒有在它的對象實現IComparable的接口。
      因此如果使用我們的之前定義的Employee類,下面的第一次調用將返回Null(序列為空),第二次調用會拋出(非空,但不包含IComparable的對象序列) 。
       

      var result1 = Enumerable.Empty<Employee>().Min();

      var result2 = employees.Min();
       
      最后,請注意,對于值類型,如果序列是空,將拋出異常, 所以下面兩個都會拋出異常:
       

      var result3 = Enumerable.Empty<int>().Min();

      var result4 = Enumerable.Empty<Employee>().Min(e => e.Dependents);
       
       

      MAX() - 返回最大的序列值

      MAX()MIN()的行為完全一樣,只不過它返回最大值,而不是最小值。因此,我們可以使用這些序列中的最大值,或從一個序列的預測最大值:

       
      ///返回33   
      VAR biggestShort = shortList.Max();

      //返回75250.0
      VAR highestSalary = employees.Max(E => e.Salary);

      其他方面,請參考Min()。

      Aggregate() - 序列的自定義累加器

       

      有三種形式的Aggregate():

      • Aggregate(Func<TSource, TSource, TSource> function)
        • 適用于一個函數,它接受一個累加器值和下一個值,并返回結果。
        • 值和序列類型是相同的。
        • 種子值是序列中的第一個值。
      • Aggregate(TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> function)
        • 應用序列中的一個函數,累加器值和下一個項目,并返回一個結果。
        • 值和序列類型可以不同或相同。
        • 必須提供一個種子值來初始化,將指定的種子值用作累加器初始值。
      • Aggregate(TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> function, Func<TAccumulate, TResult> resultProjection)
        • 同上述,將指定的種子值用作累加器的初始值,并使用指定的函數選擇結果值。

      這可能看起來相當復雜。只要記住 “此方法的工作原理是對 source 中的每個元素調用一次 func。 每次調用 func 時,都將傳遞序列中的元素和聚合值(作為 func 的第一個參數)。 并用 func 的結果替換以前的聚合值。”

       

      例如,如果我們想要做一個序列中的所有數字的乘法:

       

      var numbers = new int[] { 1, 3, 9, 2 };

      // 使用當前總值乘以下一個數值得到新的總值
      var product = numbers.Aggregate((total, next) => total * next);

      最后的值是: 1 X 3 X 9 X 2 = 54。

       

       

      下面看看怎么用更復雜的聚合計算, 可能我們想得到這樣一個結果 -- 用每個雇員的工資除以家庭總人口數(包括他自己),再將這些數相加:

       

      var weirdCalculation = employees.Aggregate(0.0, 

      (result, next) => result + next.Salary / (next.Dependents + 1));
       
      參照上面的Empolyee 定義,得到的結果是 110458.8333, 為方便理解請看下面的Excel 表格:
       
      ScreenShot009

      所以你看,我們可以做相當復雜的聚合計算,關鍵是要記住,你所提供的函數留給下一個“元素”,并把它應用到正在運行的“總值”。

       

      摘要

      四個簡單的和一個可能有點復雜的,這一組功能相當強大!這些方法可以很容易地對序列進行聚合,使你不需要進行循環和自己計算。他們很運行快也很容易使用,他們很容易閱讀,他們也被全面測試過了。敬請享受!

      更多精彩的相關文章,請閱讀喜樂的ASP.NET(Alex Song)

      本文參考翻譯自

      C#/.NET Little Wonders: Five Easy Sequence Aggregators

      posted @ 2011-08-27 06:29  擁有的都是恩典  閱讀(36639)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 日韩精品一区二区蜜臀av| 国产精品福利自产拍久久| 亚洲日本韩国欧美云霸高清| 日韩一区二区三区不卡片| 亚洲欧美精品在线| 久久婷婷五月综合97色直播| 人人妻人人妻人人片色av| 精品国产成人国产在线观看| 精品久久精品午夜精品久久| 久久精品丝袜高跟鞋| 国产不卡精品一区二区三区| 亚洲婷婷综合色高清在线 | 日本高清中文字幕免费一区二区 | 久久亚洲中文字幕伊人久久大 | 亚洲人成电影在线天堂色| 新版天堂资源中文8在线| 亚欧美闷骚院| 97亚洲色欲色欲综合网| 狠狠躁夜夜人人爽天96| 香蕉EEWW99国产精选免费| 会同县| 欧美在线观看www| 在线天堂新版资源www在线下载| 少妇高潮水多太爽了动态图| 国产精品毛片一区视频播| 999久久久免费精品播放| 忻城县| 午夜成人精品福利网站在线观看| 国产精品麻豆成人AV电影艾秋| 国产另类ts人妖一区二区| 亚洲国产精品高清线久久| 开心婷婷五月激情综合社区 | 精品国产迷系列在线观看| 亚洲日韩日本中文在线| 北岛玲中文字幕人妻系列| 中文字幕人妻色偷偷久久| 潘金莲高清dvd碟片| 337p粉嫩大胆噜噜噜| 欧美国产日韩久久mv| 国产亚洲精品黑人粗大精选| 人人做人人澡人人人爽|