2011-01-23 6 views
3

に合計を変換します。は、私はこの表現を持つ集計産物の発現

それは.Sumと同じように働いていたことを確認する(ただし、製品のように)私はちょうど合計を返す集計関数を作成してみました...

Score = g.Aggregate(0.0, (sum, nextItem) => sum + nextItem.Score.Value) 

はしかし、これは同じ結果を与えるものではありません .Sumを使用してください。どんなidasなの?

nextItem.Scoreは、です。

+3

あなたはSumと同じ結果を得られない理由を尋ね続けますが、問題を示すデータはありません。 *私たちがコンパイル、実行、デバッグできる問題を明確に示す短いプログラムを書く*。 –

答えて

3
public static class MyExtensions 
{ 
    public static double Product(this IEnumerable<double?> enumerable) 
    { 
     return enumerable 
      .Aggregate(1.0, (accumulator, current) => accumulator * current.Value); 
    } 
} 
+0

gはIGrouping型でIEnumerable型ではありませんので、私の場合は動作しません。 – Mickel

+1

はい、 'public interface IGrouping :IEnumerable 、IEnumerable' –

1

あなたの例では、0.0で乗算を開始しています。ゼロを乗算するとゼロが得られ、結果はゼロになります。

正しいのは、乗算のIDプロパティを使用することです。数値にゼロを追加すると変更されない数が残されますが、同じプロパティは1の乗算にも当てはまります。したがって、積集合を開始する正しい方法は、1.0の乗算を開始することです。

+0

はい、私はそれが誤っている(それはタイプミスでした)。しかし、ちょうど総額を見てみてください。どのようにして.Sum()と同じ結果が得られないのでしょうか? – Mickel

0

集計クエリの初期値が不明な場合に、この例のような重要なクエリが必要ない場合は、まったく使用しないことをお勧めします。 item1 * (item2 * (item3 * ... * itemN))に評価され、この

int product = sequence.Aggregate((x, acc) => x * acc); 

同様http://msdn.microsoft.com/en-us/library/bb549218.aspx

-

あなたは初期値を取ることはありません集計オーバーロードを使用することができます。代わりに1.0 * (item1 * (item2 * (item3 * ... * itemN)))と評価さ

int product = sequence.Aggregate(1.0, (x, acc) => x * acc);

//編集: ただし、重要な違いが1つあります。前者は、入力シーケンスが空のときにInvalidOperationExceptionをスローします。後の方がシード値を返します。したがって1.0です。

+0

はい、私はそれを認識しています。しかし、ちょうど総額を見てみてください。どのようにして.Sum()と同じ結果が得られないのでしょうか? – Mickel

関連する問題