В примерах MSDN Linq я нашел изящный метод под названием 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, и если да, то что я делаю не так?
Ответы:
Вы захотите использовать
Aggregate
метод расширения:double product = doubles.Aggregate(1.0, (prod, next) => prod * next);
См. MSDN для получения дополнительной информации. Он позволяет вам указать,
seed
а затем выражение для вычисления последовательных значений.источник
Func
вызывается только после достижения второго элемента. См .: msdn.microsoft.com/en-us/library/vstudio/…ToString()
, таким образом, вернуть текстовое представление всего контейнера.<double>
типа просто автоматически определяется компилятором и поэтому не является необходимым.p
иelem
ты можешь быть кем угодно. Посмотрите, как эта перегрузка используется в этом примереСвернуть (также известное как сокращение) - стандартный термин из функционального программирования. По какой-то причине он получил название Aggregate в LINQ.
double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);
источник