「フォールド」LINQ拡張メソッドはどこにありますか?


94

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に存在しますか?存在する場合、何が間違っていますか?


3
参照したサンプルページのパンくずトレイル*をチェックしてください。これは、C#3を将来の製品と呼んでいます。将来の製品は、出荷前に変更されることがよくあります。言及された他の人のように、Enumerable.Aggregateを参照して楽しんでください。:) * Visual C#デベロッパーセンター>ホーム>製品情報>将来のバージョン> 101 LINQサンプル>集計演算子
Curt Nichols

回答:


125

あなたはAggregate拡張メソッドを使いたいでしょう:

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

詳細については、MSDNを参照してください。を指定してseedから連続式を計算する式を指定できます。


4
シードも必要ないことに注意してください。シードのないオーバーロードを呼び出すと、リストの最初の要素が初期集計値として使用されFunc、2番目の要素に達したときにのみ呼び出されます。参照:msdn.microsoft.com/en-us/library/vstudio/...
ジョシュ・ギャラガー

私が正しく理解していればフォールドではありません:/フォールドは異なるタイプの両方の引数を受け入れる必要があります。たとえば、最初の引数として文字列を使用し、2番目の引数としてを使用して、ToString()コンテナ全体のテキスト表現を返すことができます。
Hi-Angel

@ Hi-Angel、いや、その例は実際には折りたたみ式です。<double>typeパラメータはちょうど自動的に必要なコンパイラによって推論し、これではありません。
kdbanman 2015年

1
ハイエンジェル@、pおよびelemようにあなたを入力するものは何でもすることができます。この例で使用されているこのオーバーロードをご覧ください
kdbanman '29

1
@kdbanman errr、⁺¹、それが本当に私にとってうまくいかなかった当時に戻った理由は本当に興味深いです...:/そうです、それはうまくいきます。
Hi-Angel

41

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

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

9
Aggregateは、OOおよびSQLレルムではより一般的な用語です。
アダムロビンソン

3
CREATE AGGREGATEキーワードを認識していませんでした(msdn.microsoft.com/en-us/library/ms182741.aspx)毎日何か新しいことを学びます。
Richard Berg、

5
おかしなことに、SQL以外では「集約」を聞いたことがありません。WPには、数十の言語のリストen.wikipedia.org/wiki/Fold_(higher-order_function)があり、C#はそれを「集約」と呼ぶ唯一のものです。「Reduce」が最も勝ち、次にMLファミリが「Fold」、Smalltalkとその仲間が「Inject」です。
Ken

12
名前はその機能の問題です。実装方法は関係ありません。そして、FWIW、左の折り畳みは、可能であれば反復的に実装されます...通常はテール再帰を介して関数型言語で。そして、C#には正しい折りたたみがありません。これは、「マップ」の「選択」ほど悪くはありませんが、愚かな名前を選択し、既存の機能テクノロジーを無視した結果です。AggregateがOO領域でより馴染みのある用語であるのは...いいえ、まったく違います。
ジムバルター2013

9
公平に言うと、これは既存の関数型テクノロジや用語を無視しているマイクロソフトではないと思いますが、データベースアクセスとSQLの用語に対する方向性は、多くのエンタープライズプログラマーがおそらく関数型プログラミングの用語よりもよく知っています。
RavuAlHemio 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.