大家好,感谢大家的阅读和回答:
在试图获得跨多种货币的每笔交易的平均值时,我遇到了一些问题。在下面的代码片段中,为了简单起见,我将其限制为仅使用港元。
我是这样开始的:
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);
}
问题是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
的对象列表。