سؤال

أحتاج إلى حساب مجموع منتج حقلين.سيتم استخدام هذا لمتوسط ​​السعر المرجح.متوسط ​​السعر = مجموع (السعر * الحجم) / مجموع (الحجم).يعرض كل من السعر 1 والسعر 2 الخطأ "الإرسال المحدد غير صالح."

     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 هو 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)
    ...
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top