web-dev-qa-db-ja.com

「Fold」LINQ拡張メソッドはどこにありますか?

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に存在しますか?

87
Ken

Aggregate拡張メソッドを使用する必要があります。

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

詳細については、 [〜#〜] msdn [〜#〜] を参照してください。 seedを指定してから、連続した値を計算する式を指定できます。

117
Jason

Fold (別名Reduce)は、関数型プログラミングの標準用語です。何らかの理由で、LINQで Aggregate という名前が付けられました。

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