位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# Lambda表達(dá)式和集合

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

    學(xué)習(xí)了 Func< >泛型委托后,就可以理解System.Li叫名稱空間為數(shù)組類型提供的一些擴(kuò)展方法了(在編碼的不同地方,可在彈出IntelliSense時(shí)看到它們)。例如,有一個(gè)擴(kuò)展方法Aggregate()定義了3個(gè)重載版本,如下所示:

  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);

與前面的擴(kuò)展方法一樣,這段代碼初看上去非常深?yuàn)W,但如果分解它們,就很容易理解其工作過程。這個(gè)函數(shù)的IntelliSense告訴用戶它會(huì)執(zhí)行如下工作:

    Applies an accumulator function over a sequence,

這表示要把一個(gè)累加器函數(shù)(可以采用Lambda表達(dá)式的形式提供)應(yīng)用于集合中從開始到結(jié)束的每個(gè)元素上。這個(gè)累加器函數(shù)必須有兩個(gè)參數(shù)和一個(gè)返回值。其中一個(gè)參數(shù)是當(dāng)前元素,另一個(gè)參數(shù)是一個(gè)種子值,集合中的第一個(gè)值,或者前一次計(jì)算的結(jié)果。

在3個(gè)重載版本中,最簡(jiǎn)單的版本只有一個(gè)泛型類型,這可從實(shí)例參數(shù)的類型推理出來(lái)。例如,在下面的代碼中,泛型類型是int(累加器函數(shù)現(xiàn)在是空的):

    int[] mylntArray = { 2, 6, 3 };

    int result = mylntArray.Aggregate(...);

這等價(jià)于:

    int[] mylntArray = { 2, 6,3);

    int result = nylntArray.Aggregate<int>(...);

這里需要的Lambda表達(dá)式可以從擴(kuò)展方法中推斷出來(lái)。在這段代碼中,類型TSource是int,所以必須為委托Func<int, int, inP4l供一個(gè)Lambda表達(dá)式。例如,可以使用前面的Lambda表達(dá)式:

    int[] mylntArray = { 2, 6, 3 };

    int result = mylntArray .Aggregate ( (paraniA,. paramB) => paramA + paramB);

這個(gè)調(diào)用會(huì)使Lambda表達(dá)式調(diào)用兩次,一次使用的參數(shù)是paramA=2, ParamB=6,另一次使用的參數(shù)是paramA=8(第一次計(jì)算的結(jié)果),paramB=3。最后賦予變ii result的結(jié)果是int值11,即數(shù)組中所有元素的總和。擴(kuò)展方法AggregateO的其他兩個(gè)重載版本是類似的,但可以執(zhí)行略微復(fù)雜的計(jì)算。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部