在lambda表达式中输入参数

时间:2015-02-18 10:31:54

标签: c# lambda delegates expression aggregate

我有这段代码

public static double Average(this ParallelQuery<int> source) {
    return source.Aggregate(
       () => new double[2], 
       (acc, elem) => { acc[0] += elem; acc[1]++; return acc;},
       (acc1, acc2) => { acc1[0] += acc2[0]; acc1[1] += acc2[1]; return acc1; },
       acc => acc[0] / acc[1]);
}

它设置了一些带有2个参数的lambda表达式,但我的问题是程序如何知道acc是double elem的数组source?没有作业

2 个答案:

答案 0 :(得分:0)

阅读ParallelEnumerable.Aggregate的文档。您可以使用种子工厂定义TAccumulate,因此类型已知。

答案 1 :(得分:0)

编译器从第一个参数中推断出类型。

由于方法签名是:

public static TResult Aggregate<TSource, TAccumulate, TResult>(
    this ParallelQuery<TSource> source,
    Func<TAccumulate> seedFactory,
    Func<TAccumulate, TSource, TAccumulate> updateAccumulatorFunc,
    Func<TAccumulate, TAccumulate, TAccumulate> combineAccumulatorsFunc,
    Func<TAccumulate, TResult> resultSelector
)

因此,TSource已知为int,只要您将() => new double[2]作为seedFactory参数传递,就会知道TAccumulatedouble[]类型seedFactory(因为TAccumulate是一个返回resultSelector)的委托。

同样,上次委托(source.Aggregate)的结果将定义结果类型。

如果您使用的是Visual Studio并将鼠标悬停在{{1}}上,则intellisense将向您显示如何推断通用参数。