我有这段代码
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
?没有作业
答案 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
参数传递,就会知道TAccumulate
是double[]
类型seedFactory
(因为TAccumulate
是一个返回resultSelector
)的委托。
同样,上次委托(source.Aggregate
)的结果将定义结果类型。
如果您使用的是Visual Studio并将鼠标悬停在{{1}}上,则intellisense将向您显示如何推断通用参数。