Pregunta

necesito para calcular una suma de producto de dos campos. Esto será utilizado por el precio medio ponderado. avgPrice = suma (precio * volumen) / sum (volumen). Tanto price1 y error de retorno price2 "la conversión especificada no es válida."

     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")))


                   };
¿Fue útil?

Solución

El problema que se está viendo es relacionados con la obtención de los valores de la DataRow. Parece que es un volume int y symbol es un double, pero en sus líneas de error que está utilizando uno o el otro como un tipo diferente. Un ejemplo similar sería tratar de hacer esto:

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

Esta fallará porque usted está tratando de desempacar un double como decimal. Por otro lado, esto funciona bien:

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

Para arreglar su ejemplo, es necesario para echar primero el valor al tipo correcto, entonces echó en consecuencia (o simplemente caer en conversiones implícitas):

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

O usando un tipo anónimo para hacer su última seleccionar más legible:

...
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)
    ...
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top