Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ.AGGRATE与结果选择器参数或直接调用方法的差异_C#_Linq_Fold - Fatal编程技术网

C# LINQ.AGGRATE与结果选择器参数或直接调用方法的差异

C# LINQ.AGGRATE与结果选择器参数或直接调用方法的差异,c#,linq,fold,C#,Linq,Fold,使用LINQ方法时,通过传递resultSelector函数或直接将聚合结果值传递给函数是否存在实际差异 代码示例(有更好的方法,但这很好地说明了问题): 最后,两条语句返回相同的字符串。 有没有代码可以用一种方式编写,但不能用另一种方式编写?据我所知,没有区别。在我的实现中,我实现了没有选择器的重载,只需使用选择器调用重载,然后使用标识转换: public static TAccumulate Aggregate<TSource, TAccumulate>( this IE

使用LINQ方法时,通过传递resultSelector函数或直接将
聚合
结果值传递给函数是否存在实际差异

代码示例(有更好的方法,但这很好地说明了问题):

最后,两条语句返回相同的字符串。
有没有代码可以用一种方式编写,但不能用另一种方式编写?

据我所知,没有区别。在我的实现中,我实现了没有选择器的重载,只需使用选择器调用重载,然后使用标识转换:

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);