Где находится метод расширения LINQ "Fold"? - PullRequest
87 голосов
/ 05 августа 2009

Я нашел в образцах Linq MSDN аккуратный метод Fold (), который я хочу использовать. Их пример:

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

К сожалению, я не могу заставить это скомпилироваться ни в их примере, ни в моем собственном коде, и я не могу найти где-либо еще в MSDN (например, методы расширения Enumerable или Array), в которых упоминается этот метод. Ошибка, которую я получаю, - старая ошибка «ничего не знаю об этом»:

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?)

Я использую другие методы, которые, как мне кажется, исходят от Linq (например, Select () и Where ()), и я «использую System.Linq», поэтому я думаю, что все в порядке.

Действительно ли этот метод существует в C # 3.5, и если да, то что я делаю не так?

Ответы [ 2 ]

117 голосов
/ 05 августа 2009

Вы хотите использовать метод расширения Aggregate:

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

См. MSDN для получения дополнительной информации. Он позволяет указать seed, а затем выражение для вычисления последовательных значений.

39 голосов
/ 05 августа 2009

Fold (он же сокращение) - это стандартный термин из функционального программирования. По какой-то причине он получил название Aggregate в LINQ.

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