位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# Lambda表达式和集合

提问人:刘团圆发布时间:2020-12-08

    学习了 Func< >泛型委托后,就可以理解System.Li叫名称空间为数组类型提供的一些扩展方法了(在编码的不同地方,可在弹出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);

与前面的扩展方法一样,这段代码初看上去非常深奥,但如果分解它们,就很容易理解其工作过程。这个函数的IntelliSense告诉用户它会执行如下工作:

    Applies an accumulator function over a sequence,

这表示要把一个累加器函数(可以采用Lambda表达式的形式提供)应用于集合中从开始到结束的每个元素上。这个累加器函数必须有两个参数和一个返回值。其中一个参数是当前元素,另一个参数是一个种子值,集合中的第一个值,或者前一次计算的结果。

在3个重载版本中,最简单的版本只有一个泛型类型,这可从实例参数的类型推理出来。例如,在下面的代码中,泛型类型是int(累加器函数现在是空的):

    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表达式调用两次,一次使用的参数是paramA=2, ParamB=6,另一次使用的参数是paramA=8(第一次计算的结果),paramB=3。最后赋予变ii result的结果是int值11,即数组中所有元素的总和。扩展方法AggregateO的其他两个重载版本是类似的,但可以执行略微复杂的计算。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部