C# LINQ.AGGRATE与结果选择器参数或直接调用方法的差异
使用LINQ方法时,通过传递resultSelector函数或直接将C# LINQ.AGGRATE与结果选择器参数或直接调用方法的差异,c#,linq,fold,C#,Linq,Fold,使用LINQ方法时,通过传递resultSelector函数或直接将聚合结果值传递给函数是否存在实际差异 代码示例(有更好的方法,但这很好地说明了问题): 最后,两条语句返回相同的字符串。 有没有代码可以用一种方式编写,但不能用另一种方式编写?据我所知,没有区别。在我的实现中,我实现了没有选择器的重载,只需使用选择器调用重载,然后使用标识转换: public static TAccumulate Aggregate<TSource, TAccumulate>( this IE
聚合
结果值传递给函数是否存在实际差异
代码示例(有更好的方法,但这很好地说明了问题):
最后,两条语句返回相同的字符串。
有没有代码可以用一种方式编写,但不能用另一种方式编写?据我所知,没有区别。在我的实现中,我实现了没有选择器的重载,只需使用选择器调用重载,然后使用标识转换:
public static TAccumulate Aggregate<TSource, TAccumulate>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func)
{
return source.Aggregate(seed, func, x => x);
}
公共静态累积聚合(
这是一个数不清的来源,
玉米粒,
Func Func)
{
返回source.Aggregate(seed,func,x=>x);
}
如果换一种方式做这件事是完全合理的
public static TResult Aggregate<TSource, TAccumulate, TResult>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func,
Func<TAccumulate, TResult> resultSelector)
{
var intermediate = source.Aggregate(seed, func);
return resultSelector(intermediate);
}
publicstatictresult聚合(
这是一个数不清的来源,
玉米粒,
Func Func,
Func结果选择器)
{
var intermediate=源.聚合(种子,函数);
返回结果选择器(中间);
}
现在,仅仅因为它们是等价的并不意味着过载是无用的。例如,有时使用lambda表达式更容易表示结果选择器:
var result = list.Aggregate(..., ..., total => total < 0 ? total + 1
: total - 1);
var result=list.Aggregate(…,…,total=>total<0?total+1
:总数-1);
您可以创建一个单独的方法(或者只创建一个Func
)来实现这一点,但在某些情况下,您希望在单个方法调用中完成整个过程
简而言之,在每种情况下,使用对你最方便的方法;就我所知,它们是等效的。没错!显示最后一行返回结果选择器(result)
不依赖于任何条件,因此它与之后执行相同。
var result = list.Aggregate(..., ..., total => total < 0 ? total + 1
: total - 1);