95
votes

I found in MSDN's Linq samples a neat method called Fold() that I want to use. Their example:

double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; 
double product = 
     doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 

Unfortunately, I can't get this to compile, either in their example or in my own code, and I can't find anywhere else in MSDN (like Enumerable or Array extension methods) that mention this method. The error I get is a plain old "don't know anything about that" error:

error CS1061: 'System.Array' does not contain a definition for 'Fold' and no 
extension method 'Fold' accepting a first argument of type 'System.Array' could 
be found (are you missing a using directive or an assembly reference?)

I'm using other methods which I believe come from Linq (like Select() and Where()), and I'm "using System.Linq", so I think that's all OK.

Does this method really exist in C# 3.5, and if so, what am I doing wrong?

2
Check out the bread crumb trail* on the samples page you referenced--it refers to C# 3 as a future product. Future products often change before they ship. Like the others mentioned, see Enumerable.Aggregate and have fun. :) *Visual C# Developer Center > Home > Product Information > Future Versions > 101 LINQ Samples > Aggregate Operators - Curt Nichols

2 Answers

131
votes

You will want to use the Aggregate extension method:

double product = doubles.Aggregate(1.0, (prod, next) => prod * next);

See MSDN for more information. It lets you specify a seed and then an expression to calculate successive values.

42
votes

Fold (aka Reduce) is the standard term from functional programming. For whatever reason, it got named Aggregate in LINQ.

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);