日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2025/5/22 C# 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 表格: ?

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

?

摘要

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

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

本文參考翻譯自

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

轉載于:https://www.cnblogs.com/multiplesoftware/archive/2011/08/27/2155268.html

總結

以上是生活随笔為你收集整理的C# 中奇妙的函数–6. 五个序列聚合运算(Sum, Average, Min, Max,Aggregate)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩在线一区二区 | 在线观看黄色av网站 | 日本wwwxx | 免费成人结看片 | 亚洲影音 | 久草免费在线播放 | 国产有码在线 | 国产午夜福利视频在线观看 | 午夜免费福利在线 | 91免费视频 | 日本三级中文字幕 | 国产寡妇亲子伦一区二区三区四区 | 欧美视频免费在线观看 | 久久99激情 | 婷婷色影院| 黄色片一级 | 久草资源在线 | 操大爷影院 | 韩国av不卡 | 国产又黄又爽视频 | 亚洲久久影院 | 久久精品导航 | 精品人妻一区二区三区含羞草 | 日韩美女黄色片 | 亚洲成人av一区二区三区 | 伊人网在线视频观看 | 青娱乐福利视频 | 亚洲一区二区三区久久久 | 国产麻豆免费视频 | 女王人厕视频2ⅴk | 成人18视频在线观看 | 成年人视频网站 | 国产又粗又猛又爽免费视频 | 污视频在线观看免费 | 国产污视频在线 | 成人在线观看h | 日韩一级片在线播放 | 91av俱乐部| 99精品视频在线播放免费 | 国产亚洲网站 | 免费看毛片网站 | 特大黑人巨人吊xxxx | 亚洲免费观看高清完整版在线 | 精品久久久久久亚洲综合网站 | 内射无码专区久久亚洲 | 欧美视频在线不卡 | 精品人妻二区中文字幕 | 亚洲一区二区三区四区在线 | 五级黄高潮片90分钟视频 | 成人av电影免费观看 | 久热精品视频在线观看 | 黄色一及片 | 国产精品美乳在线观看 | 肉丝肉足丝袜一区二区三区 | 伊人中文字幕在线 | 成人黄色在线视频 | 欧美日韩国产一区二区三区 | 中出在线 | av中文字幕一区二区 | 懂色一区二区二区av免费观看 | 国产微拍精品一区 | 狠狠躁日日躁夜夜躁av | 97久久人人超碰caoprom欧美 | 色综合久久久久久 | 日韩久久精品一区二区 | 亚洲人高潮女人毛茸茸 | 夜夜草网站 | 永久免费未满蜜桃 | 午夜免费毛片 | 粉嫩久久99精品久久久久久夜 | 依人成人综合网 | 国产日产精品一区二区三区 | 精品理论片 | 综合国产视频 | 99热综合| 麻豆传媒在线观看视频 | 97超碰资源站 | 三上悠亚三级 | 成人国产精品入口免费视频 | 国产av一区二区三区最新精品 | 800av凹凸| 香蕉日日 | 国产h视频 | 日本特级黄色片 | 涩涩爱在线 | 日韩欧美在线一区 | 91性高潮久久久久久久 | 性生活在线视频 | 日韩精品在线一区二区 | 视频在线观看一区二区三区 | av动漫免费观看 | 男女无套免费视频网站动漫 | 国产精品久久77777 | 五月婷网 | 九九视频在线播放 | 久久国产色 | 日本福利一区二区 | hd性videos意大利精品 | 麻豆一区二区99久久久久 |