如何使用 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 方法