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