문제

두 분야의 제품 합계를 계산해야합니다. 이것은 평균 가중 가격에 사용됩니다. avgprice = sum (가격*볼륨) / 합 (볼륨). 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")))


                   };
도움이 되었습니까?

해결책

당신이보고있는 문제는 DataRow. 보입니다 volume 이다 int 그리고 symbol a double, 그러나 오류 라인에서 하나 또는 다른 하나를 다른 유형으로 사용하고 있습니다. 비슷한 예는 이것을 시도하는 것입니다.

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

Unbox a를 시도하기 때문에 이것은 실패합니다 double A로 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