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>
)来执行此操作,但在某些情况下,您希望在单个方法调用中完成所有操作。
简而言之 - 在每种情况下使用对您来说最方便的方法;据我所知,它们是等价的。
通过传递 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>
)来执行此操作,但在某些情况下,您希望在单个方法调用中完成所有操作。
简而言之 - 在每种情况下使用对您来说最方便的方法;据我所知,它们是等价的。