budi
budi

Reputation: 6551

How to right fold using LINQ?

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

Answers (2)

Aleks Andreev
Aleks Andreev

Reputation: 7054

In case you already using MoreLinq check AggregateRight method

Upvotes: 1

budi
budi

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

Related Questions