我有以下情况:
函数GetDict()
返回一个Dictionary<double, double>
对象,并在一个循环中被调用多次(这个数字由用户指定)。返回的Dictionary始终保证包含相同的键集(我现在假设这是为了简单)。
我的目标是最终获得每个键返回的所有值的平均值:
public Dictionary<double, double> CalculateAveragePerKey(int N)
{
var aggregateDict = new Dictionary<double, double>();
for(int i=0; i < N; i++)
{
var returnedDict = GetDict();
// aggregateDict -- how to calculate an average of values for each key?
}
return aggregateDict;
}
public Dictionary<double, double> GetDict()
{
var newDict = new Dictionary<double, double>();
// populate the newDict, always guaranteed (assumed for simplicity)
// to contain the same set of keys ...
return newDict;
}
因此,如果N = 3且在循环内,则返回的Dictionary包含键10.0
的值1.0
,2.3
和3.0
,最后{密钥aggregateDict
的{1}}值应为2.1
。
如果这不是解决此类问题的最佳数据结构或方法,我绝对可以重构我的代码以使用其他一些数据结构或方法。我只是在寻找最有效的方式。
答案 0 :(得分:1)
您可以修改代码以分两步计算平均值:
GetDict()
时,请检查其密钥,并将值添加到aggregateDict
N
。您还可以在循环中将GetDict()
的值除以N
,具体取决于您在GetDict()
中获得的值的分布。
您也可以使用LINQ执行此操作而不使用循环,如下所示:
var avg = Enumerable
.Range(0, N)
.SelectMany(n => GetDict())
.GroupBy(p => p.Key)
.ToDictionary(
g => g.Key
, g => g.Sum(p => p.Value) / g.Count()
);
请注意,在使用double
作为字典键时需要非常小心,因为浮点类型本质上是不精确的。结果,您可能会看到两个非常接近的数字映射到不同的字典键。