我有一个动态结果集,其中包含一个键值double(但编译器仍将其视为动态结果)。我试图对此求和,但无法找出正确的类型或如何调用Linq Average()
方法的特定重载。当我确定需要使用Average<dynamic>(Func<dynamic, int> selector)
版本时,它会一直尝试调用Average<dynamic>(Func<dynamic, double> selector)
版本。
Average()
和Sum()
方法上的 Intellisense告诉我编译器正在选择<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());
答案 0 :(得分:2)
如果您强制将动态类型的转换加倍而不是让.ToDouble
方法本身找到合适的类型,则它是有效的。而是进行显式强制转换:
for(var i = 0; i < result.Count; i++)
cumulativeAvg.Add(result.Take(i + 1).Average(r => (double)r.myDouble));