我应该如何合并"多个字典成为"聚合"在C#?

时间:2014-07-11 16:48:18

标签: c# dictionary collections hashtable

我有以下情况:

函数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.02.33.0,最后{密钥aggregateDict的{​​1}}值应为2.1

如果这不是解决此类问题的最佳数据结构或方法,我绝对可以重构我的代码以使用其他一些数据结构或方法。我只是在寻找最有效的方式。

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作为字典键时需要非常小心,因为浮点类型本质上是不精确的。结果,您可能会看到两个非常接近的数字映射到不同的字典键。