LINQ平均动态两倍

时间:2018-08-08 18:09:10

标签: c# linq casting

我有一个动态结果集,其中包含一个键值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());

1 个答案:

答案 0 :(得分:2)

如果您强制将动态类型的转换加倍而不是让.ToDouble方法本身找到合适的类型,则它是有效的。而是进行显式强制转换:

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