C# 动态双精度的Linq平均

C# 动态双精度的Linq平均,c#,linq,casting,C#,Linq,Casting,我有一个动态结果集,其中包含一个双精度键值(但编译器仍将其视为动态)。我试图对此进行累积平均,但无法找出正确的强制转换或如何调用Linqaverage()方法的特定重载。当我非常确定我需要Average(Func选择器)版本时,它总是尝试调用Average(Func选择器)版本 Average()和Sum()方法上的Intellisense显示编译器正在选择版本。如何指定使用double版本 这是一个很好的例子,展示了我尝试过的事情及其相应的错误。在这一点上,我觉得我已经尝试了我能想到的每一种组

我有一个动态结果集,其中包含一个双精度键值(但编译器仍将其视为动态)。我试图对此进行累积平均,但无法找出正确的强制转换或如何调用Linq
average()
方法的特定重载。当我非常确定我需要
Average(Func选择器)
版本时,它总是尝试调用
Average(Func选择器)
版本

Average()
Sum()
方法上的Intellisense显示编译器正在选择
版本。如何指定使用
double
版本

这是一个很好的例子,展示了我尝试过的事情及其相应的错误。在这一点上,我觉得我已经尝试了我能想到的每一种组合,无论是否使用
Cast()
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>();
对于以下所有循环,错误为: 无法将类型“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(变量i=0;iConvert.ToDouble(r.myDouble));
对于(变量i=0;iConvert.ToDouble(r.myDouble)).Average();
对于(变量i=0;iConvert.ToDouble(r.myDouble)).ToList().Average();
对于(变量i=0;iConvert.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());
for(变量i=0;iConvert.ToDouble(r.myDouble)).Cast().Average();
对于(变量i=0;iConvert.ToDouble(r.myDouble)).Average();
对于(变量i=0;iConvert.ToDouble(r.myDouble)).Cast().Take(i+1.Average());

如果您强制动态的强制转换为双倍,而不是让
.ToDouble
方法本身找到合适的类型,那么它就起作用了。相反,执行显式强制转换:

for(var i = 0; i < result.Count; i++)
    cumulativeAvg.Add(result.Take(i + 1).Average(r => (double)r.myDouble));
for(变量i=0;i(double)r.myDouble);

什么是
结果
?这是打字错误,应该是
结果
?但是在这种情况下,
results
不能包含
myDouble
的定义。是的,输入错误,现已修复
result
是DB查询的动态结果,它包含多个值,其中一个是双精度值。我已经更新了一个示例值以进行澄清。实际上我刚刚尝试了这个,并发现了问题。在我的特定情况下,其中一个条目隐藏了一个
null
值,这就是上一个
Cast()
无效的原因。使用这一明确的演员阵容最终将问题暴露出来。
for(var i = 0; i < result.Count; i++)
    cumulativeAvg.Add(result.Take(i + 1).Average(r => (double)r.myDouble));