0

2 つのフィールドの積の合計を計算する必要があります。これは加重平均価格に使用されます。平均価格 = 合計 (価格*ボリューム) / 合計 (ボリューム)。price1 と price2 の両方が「指定されたキャストが無効です」というエラーを返します。

     var result3 = from sym in dataTableAsEnumerable()
                   group sym by new { symbol = sym["symbol"] } into grouped
                   select new
                   {
                      //             SYMBOL = sym.Field<string>("symbolCAN"),
                      SYMBOL = grouped.Key.symbol,
                      tradeTimeMin = grouped.Min(e => e["tradeTimeMin"]),
                      tradeTimeMax = grouped.Max(e => e["tradeTimeMax"]),
                      volume = grouped.Sum(e => (int)e["volume"] ),
                      price1 = grouped.Sum(e => (double)e["volume"] * (double)e["symbol"]) / grouped.Sum(e => (double)e["volume"]),
                      price2 = grouped.Sum(e => ( e.Field<decimal>("volume") * e.Field<decimal>("symbol")))


                   };
4

1 に答える 1

0

あなたが見ている問題は、から値を取得することに関連していますDataRowvolumeisintsymbolis のように見えdoubleますが、エラー行ではどちらか一方を別の型として使用しています。比較可能な例は、これを行おうとしています:

object o = 3.0; // double
decimal m = (decimal)o;

doubleをとしてアンボックスしようとしているため、これは失敗しますdecimal。一方、これはうまくいきます:

object o = 3.0; // double
double d = (double)o;
decimal m = (decimal)d;

例を修正するには、最初に値を正しい型にキャストしてから、それに応じてキャストする必要があります (または単に暗黙のキャストにフォールバックします)。

    ...
    price = grouped.Sum(e => e.Field<int>("volume") * e.Field<double>("symbol")) /
            grouped.Sum(e => e.Field<int>("volume"))
    ...

または、匿名型を使用して、最終的な選択を読みやすくします。

...
let data = grouped.Select(e => new {
   Volume = e.Field<int>("volume"),
   Symbol = e.Field<double>("symbol")
})
select new
{
    ...
    price = data.Sum(x => x.Volume * x.Symbol) / data.Sum(x => x.Volume)
    ...
};
于 2009-09-01T22:54:07.160 に答える