97

我在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 中是否真的存在,如果存在,我做错了什么?

4

2 回答 2

133

您将需要使用Aggregate扩展方法:

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

有关详细信息,请参阅MSDN。它允许您指定 a seed,然后指定一个表达式来计算连续值。

于 2009-08-05T01:22:56.307 回答
42

Fold(又名 Reduce)是函数式编程的标准术语。无论出于何种原因,它在 LINQ 中被命名为Aggregate 。

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);
于 2009-08-05T01:22:27.553 回答