C# Lambda表達式和集合
學習了 Func< >泛型委托后,就可以理解System.Li叫名稱空間為數(shù)組類型提供的一些擴展方法了(在編碼的不同地方,可在彈出IntelliSense時看到它們)。例如,有一個擴展方法Aggregate()定義了3個重載版本,如下所示:
public static TSource Aggregate<TSource>(
this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func);
public static TAccumulate Aggregate<TSource, TAccumulate>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate〉 func);
public static TResult Aggregate<TSource, TAccumulate,Aggregate<TSource, TAccumulate, TResult>{ TResult>(
this IEnumerable<TSource> source,
TAccumulate seed,
FuncCTAccumulate, TSource, TAccumulate> func,
FuncCTAccumulate, TResult> resultSelector);
與前面的擴展方法一樣,這段代碼初看上去非常深奧,但如果分解它們,就很容易理解其工作過程。這個函數(shù)的IntelliSense告訴用戶它會執(zhí)行如下工作:
Applies an accumulator function over a sequence,
這表示要把一個累加器函數(shù)(可以采用Lambda表達式的形式提供)應用于集合中從開始到結束的每個元素上。這個累加器函數(shù)必須有兩個參數(shù)和一個返回值。其中一個參數(shù)是當前元素,另一個參數(shù)是一個種子值,集合中的第一個值,或者前一次計算的結果。
在3個重載版本中,最簡單的版本只有一個泛型類型,這可從實例參數(shù)的類型推理出來。例如,在下面的代碼中,泛型類型是int(累加器函數(shù)現(xiàn)在是空的):
int[] mylntArray = { 2, 6, 3 };
int result = mylntArray.Aggregate(...);
這等價于:
int[] mylntArray = { 2, 6,3);
int result = nylntArray.Aggregate<int>(...);
這里需要的Lambda表達式可以從擴展方法中推斷出來。在這段代碼中,類型TSource是int,所以必須為委托Func<int, int, inP4l供一個Lambda表達式。例如,可以使用前面的Lambda表達式:
int[] mylntArray = { 2, 6, 3 };
int result = mylntArray .Aggregate ( (paraniA,. paramB) => paramA + paramB);
這個調用會使Lambda表達式調用兩次,一次使用的參數(shù)是paramA=2, ParamB=6,另一次使用的參數(shù)是paramA=8(第一次計算的結果),paramB=3。最后賦予變ii result的結果是int值11,即數(shù)組中所有元素的總和。擴展方法AggregateO的其他兩個重載版本是類似的,但可以執(zhí)行略微復雜的計算。
點擊加載更多評論>>