0

我需要计算两个字段的乘积之和。这将用于平均加权价格。avgPrice = sum(price*volume) / sum(volume)。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

您看到的问题与从DataRow. 它看起来像volumeis anintsymbolis a double,但是在您的错误行中,您将其中一个或另一个用作不同的类型。一个类似的例子是尝试这样做:

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

这将失败,因为您试图将 a 拆箱doubledecimal. 另一方面,这很好用:

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 回答