lambda 表达式中的输入参数
Input parameters in lambda expressions
我有这个代码
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
的一个元素?没有作业
阅读 ParallelEnumerable.Aggregate 的文档。你用你的种子工厂定义 TAccumulate
,所以类型是已知的。
编译器根据您的第一个参数推断类型。
因为方法签名是:
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
是 returns TAccumulate
的委托)。
同样,最后一个委托 (resultSelector
) 的结果将定义结果类型。
如果您正在使用 Visual Studio 并将鼠标悬停在 source.Aggregate
上,intellisense 将向您显示通用参数是如何推断出来的。
我有这个代码
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
的一个元素?没有作业
阅读 ParallelEnumerable.Aggregate 的文档。你用你的种子工厂定义 TAccumulate
,所以类型是已知的。
编译器根据您的第一个参数推断类型。
因为方法签名是:
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
是 returns TAccumulate
的委托)。
同样,最后一个委托 (resultSelector
) 的结果将定义结果类型。
如果您正在使用 Visual Studio 并将鼠标悬停在 source.Aggregate
上,intellisense 将向您显示通用参数是如何推断出来的。