如何使用 LINQ 正确折叠?
How to right fold using LINQ?
使用 LINQ,我们可以通过 Aggregate
:
在列表上执行 left fold
var numbers = new[] { 1, 2, 3, 4 };
var value = numbers.Aggregate((a, b) => a - b); // ((1 - 2) - 3) - 4 == -8
是否有类似的方法使用 LINQ 执行右折叠?
var value = numbers.Aggregate(???); // 1 - (2 - (3 - 4)) == -2
右折叠本质上是从右向左折叠。我们可以复制右折叠,如果我们先 Reverse
可枚举,然后通过 Aggregate
:
执行左折叠
var value = numbers.Reverse().Aggregate((a, b) => a - b);
作为扩展方法:
public static TSource RightFold<TSource>(this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func)
{
return source.Reverse().Aggregate(func);
}
用法:
var value = numbers.RightFold((a, b) => a - b); // ((4 - 3) - 2) - 1 == -2
// 1 - (2 - (3 - 4)) == ((4 - 3) - 2) - 1
如果您已经在使用 MoreLinq 检查 AggregateRight
方法
使用 LINQ,我们可以通过 Aggregate
:
var numbers = new[] { 1, 2, 3, 4 };
var value = numbers.Aggregate((a, b) => a - b); // ((1 - 2) - 3) - 4 == -8
是否有类似的方法使用 LINQ 执行右折叠?
var value = numbers.Aggregate(???); // 1 - (2 - (3 - 4)) == -2
右折叠本质上是从右向左折叠。我们可以复制右折叠,如果我们先 Reverse
可枚举,然后通过 Aggregate
:
var value = numbers.Reverse().Aggregate((a, b) => a - b);
作为扩展方法:
public static TSource RightFold<TSource>(this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func)
{
return source.Reverse().Aggregate(func);
}
用法:
var value = numbers.RightFold((a, b) => a - b); // ((4 - 3) - 2) - 1 == -2
// 1 - (2 - (3 - 4)) == ((4 - 3) - 2) - 1
如果您已经在使用 MoreLinq 检查 AggregateRight
方法