在分组LINQ查询上执行计算的问题输出IEnumerable和IEnumerable<小数?比;数字

本文关键字:IEnumerable decimal 数字 小数 输出 查询 LINQ 执行 问题 计算 | 更新日期: 2023-09-27 18:12:30

大家好,感谢大家的阅读和回答:

在试图获得跨多种货币的每笔交易的平均值时,我遇到了一些问题。在下面的代码片段中,为了简单起见,我将其限制为仅使用港元。

我是这样开始的:

var avgYieldPerTran = (from fixYield in Total
                   group fixYield by fixYield.trans_id into set
                   select new { 
                         PnL = set.Select(s => s.p_and_l), 
                         exHK = set.Select(s => s.exchange_rate_hkd), 
                         size = set.Select(s => s.size)
                   }).ToList();
decimal avgYieldPTHKD = 0;
foreach(var test in avgYieldPerTran)
                {
              avgYieldPTHKD += (((test.PnL / test.exHK) / (test.size / test.exHK)) * 100);
                }

PnL,exHK是可空的小数,size只是一个小数。

上面的代码给了我下面的编译问题进行测试。PnL/test.exHK:

Operator '/' cannot be applied to operands of type <decimal?> and <decimal?>

这个问题与test有关。size/test.exHK:

Operator '/' cannot be applied to operands of type <decimal> and <decimal?>

我试图通过以下方式转换为十进制来解决这个问题:

avgYieldPBHKD += (((Convert.ToDecimal(test.PnL) / Convert.ToDecimal(test.exHK)) / (Convert.ToDecimal(test.size) / Convert.ToDecimal(test.exHK))) * 100);
然而,这反过来又给了我一个运行时问题:
Unable to cast object of type 'WhereSelectEnumerableIterator'2[AutomatedTesting.transation, System.Nullable'1[System.Decimal]]' to type 'System.IConvertible'.

我想把最后的结果四舍五入到小数点后两位,但我希望这是我能独自计算出来的。

如果你能帮助我解决我的类型划分问题,我将不胜感激。

亲切的问候。

edit更改了问题标题,因为我有一种感觉,和值是IEnumerable<decimal> and IEnumerable<decimal?>的事实可能很重要…

edit - Answer Answer由Pragmateek协助如下:

var avgYieldPerTran = (from fixYield in Total
                   group fixYield by fixYield.trans_id into set
                   select new { 
                         PnL = set.Sum(s => s.p_and_l), 
                         exHK = set.Average(s => s.exchange_rate_hkd), 
                         size = set.Sum(s => s.size)
                   }).ToList();
decimal avgYieldPTHKD = 0;
foreach(var test in avgYieldPerTran)
                {
              avgYieldPTHKD += (decimal)(((test.PnL / test.exHK) / (test.size / test.exHK)) * 100);
                }

在分组LINQ查询上执行计算的问题输出IEnumerable<decimal>和IEnumerable<小数?比;数字

问题是Select返回IEnumerable s,并且没有/操作符。

你可能想要这样的东西:

var avgYieldPerTran = (from fixYield in Total
               group fixYield by fixYield.trans_id into set
               select new { 
                     PnL = set.Average(s => s.p_and_l), 
                     exHK = set.Average(s => s.exchange_rate_hkd), 
                     size = set.Average(s => s.size)
               }).ToList();

那么您将获得一个具有scalar properties的对象列表,而不是具有collections properties的对象列表。