LINQ .Aggregate 与结果选择器参数或直接调用方法的区别

Difference of LINQ .Aggregate with result selector parameter or directly calling method

通过传递 resultSelector 函数或直接将 Aggregate 结果值传递给函数来使用 LINQ Aggregate 方法有实际区别吗?

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

var list = new string[] { "a", "b", "c" };
list.Aggregate(new StringBuilder(), (sb, s) => sb.AppendLine(s), sb => sb.ToString());
list.Aggregate(new StringBuilder(), (sb, s) => sb.AppendLine(s)).ToString();

最后,两个语句return相同的字符串。 是否有代码可以用一种方式编写,而不能用另一种方式编写?

据我所知,没有区别。查看我的 Edulinq 实现,我已经实现了没有选择器的重载,只需调用重载 一个选择器,然后进行身份转换:

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source,
    TAccumulate seed,
    Func<TAccumulate, TSource, TAccumulate> func)
{
    return 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);
}

现在仅仅因为它们是等价的并不意味着重载是无用的。例如,有时使用 lambda 表达式来表达结果选择器可能更容易:

var result = list.Aggregate(..., ..., total => total < 0 ? total + 1
                                                         : total - 1);

您可以创建一个单独的方法(或只是一个 Func<TArg, TResult>)来执行此操作,但在某些情况下,您希望在单个方法调用中完成所有操作。

简而言之 - 在每种情况下使用对您来说最方便的方法;据我所知,它们是等价的。