我需要计算两个字段的乘积的总和。这将用于加权平均价格。 avgPrice =总和(价格*体积)/ SUM(体积)。既价格1和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")))


                   };
有帮助吗?

解决方案

您所看到的问题是有关获取值出DataRow的。它看起来像volumeintsymboldouble,但在你的错误行你使用一个或另一个为不同的类型。可比较的例子是试图做到这一点:

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)
    ...
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top