gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:09:32 25 4
gpt4 key购买 nike

使用 LINQ Aggregate 时是否存在实际差异?通过传递 resultSelector 函数或直接将 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();

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

最佳答案

据我所知,没有区别。看着我的 Edulinq实现,我已经在没有选择器的情况下实现了重载,只是通过调用重载 with 一个选择器,然后进行身份转换:

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> )来执行此操作,但在某些情况下,您希望在单个方法调用中完成所有操作。

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

关于c# - LINQ .Aggregate 与结果选择器参数或直接调用方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28689988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com