我有一个动态结果集,其中包含一个键值 double(但编译器仍将其视为动态结果)。我试图计算这个的累积平均值,但无法弄清楚正确的转换或如何调用 LinqAverage()方法的特定重载。Average<dynamic>(Func<dynamic, int> selector)当我非常确定我需要该Average<dynamic>(Func<dynamic, double> selector)版本时,它始终会尝试调用该版本。Average()和Sum()方法上的智能感知向我展示了编译器正在选择<dynamic, int>版本。如何指定使用double版本?这是我尝试过的事情的迭代及其相应错误的一个很好的示例。在这一点上,我觉得我已经想尽组合,并使用或不Cast<double>()和Convert.ToDouble(),我能想到的。// ## filled with values from DB query, but here with examples ##var result = new List<dynamic>() { new { myDouble = 0.123 }, new { myDouble = 0.456 } }; var cumulativeAvg = new List<double>();更新我的结果集原来有一个隐藏的null值,这导致了错误:var result = new List<dynamic>() { new { myDouble = 0.123 } , new { myDouble = 0.456 } , new { myDouble = null }}; 对于以下所有循环,错误为: 无法将类型“double”隐式转换为“int”for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Average(r => Convert.ToDouble(r.myDouble)));for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Select(r => Convert.ToDouble(r.myDouble)).Average());for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Select(r => Convert.ToDouble(r.myDouble)).ToList().Average());for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Sum(r => Convert.ToDouble(r.myDouble)) / (i + 1));对于以下所有循环,错误为: 指定的强制转换无效。for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Select(r => Convert.ToDouble(r.myDouble)).Cast<double>().Average());for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Cast<double>().Select(r => Convert.ToDouble(r.myDouble)).Average());for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Select(r => Convert.ToDouble(r.myDouble)).Cast<double>().Take(i + 1).Average());
1 回答
湖上湖
TA贡献2003条经验 获得超2个赞
如果您强制动态的强制转换为双倍而不是让.ToDouble
方法自己找到适当的类型,它就会起作用。相反,做一个明确的演员:
for(var i = 0; i < result.Count; i++) cumulativeAvg.Add(result.Take(i + 1).Average(r => (double)r.myDouble));
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消