Reputation: 6551
Using LINQ, we can perform a left fold on a list via Aggregate
:
var numbers = new[] { 1, 2, 3, 4 };
var value = numbers.Aggregate((a, b) => a - b); // ((1 - 2) - 3) - 4 == -8
Is there a similar way using LINQ to perform a right fold?
var value = numbers.Aggregate(???); // 1 - (2 - (3 - 4)) == -2
Upvotes: 2
Views: 1170
Reputation: 7054
In case you already using MoreLinq check AggregateRight
method
Upvotes: 1
Reputation: 6551
Right folding is essentially folding from right to left. We can replicate a right fold, if we Reverse
the enumerable first, then perform a left fold via Aggregate
:
var value = numbers.Reverse().Aggregate((a, b) => a - b);
As an extension method:
public static TSource RightFold<TSource>(this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func)
{
return source.Reverse().Aggregate(func);
}
Usage:
var value = numbers.RightFold((a, b) => a - b); // ((4 - 3) - 2) - 1 == -2
// 1 - (2 - (3 - 4)) == ((4 - 3) - 2) - 1
Upvotes: 6