前言
在Dotnet開發過程中,Average作為IEnumerable的擴展方法,十分常用。本文對Average方法的關鍵源碼進行簡要分析,以方便大家日后更好的使用該方法。
使用
Average?計算數值序列的平均值
假如我們有這樣的一個集合
List<int>?grades?=?new?List<int>?{?78,?92,?100,?37,?81?};
不使用linq
我們要計算該集合的平均值,且不能使用linq,那么我們的計算平均值方法和下面這段代碼應該沒有多大的出入
double?Average(List<int>?source){if?(source?==?null){throw?new?Exception("集合不能為空");}long?sum?=?0L;long?count?=?0L;foreach?(var?item?in?source){sum?+=?item;count++;}if?(count?==?0){throw?new?Exception("無元素");}return?(double)sum?/?(double)count;
}
使用linq
double?average?=?grades.Average();
源碼解析
方法
public?static?double?Average(this?IEnumerable<int>?source)
參數
source 元素的類型
返回值
double
源碼:
public?static?double?Average(this?IEnumerable<int>?source){if?(source?==?null){throw?new?Exception("source?is?null");}long?num?=?0L;long?num2?=?0L;checked{foreach?(int?item?in?source){num?+=?item;num2++;}if?(num2?>?0){return?(double)num?/?(double)num2;}throw?new?Exception("NoElements");}}
將上述代碼放到cheked塊里面,就會使運行時引發System.OverflowException異常。這樣就可以讓你的運算更加準確,避免二進制的回繞。
Enumerable.Average() 重載方法一共十多個,這里選擇了最典型的一個講解!
總結
文章來源于即興發揮,本篇就說到這里啦,希望對您有幫助。