动态双精度的 Linq 平均值

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


拉风的咖菲猫
浏览 172回答 1
1回答

湖上湖

如果您强制动态的强制转换为双倍而不是让.ToDouble方法自己找到适当的类型,它就会起作用。相反,做一个明确的演员:for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;result.Count;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;cumulativeAvg.Add(result.Take(i&nbsp;+&nbsp;1).Average(r&nbsp;=>&nbsp;(double)r.myDouble));
打开App,查看更多内容
随时随地看视频慕课网APP