提问者:小点点

C#获取嵌套字典的嵌套值的和


我有一本字典,它的结构如下:

{
    "group_1": {
        "a": 1.0,
        "b": 1.5,
        "c": 2.0,
        "d": 4.0
    },
    "group_2": {
        "a": 3.0,
        "b": 3.5,
        "c": 6.0,
        "d": 4.7
    },
    "group_3": {
        "a": 0,
        "b": 1.9,
        "c": 2.1,
        "d": 3.0
    },
    "group_4": {
        "a": 0.4,
        "b": 1.3,
        "c": 1.0,
        "d": 2.0
    }
}

我要做的是求和所有兄弟dict的所有相应值,然后创建一个新dict,如下所示:

{
    "a": 3.4,
    "b": 7.2,
    "c": 11.1,
    "d": 13.7
}

我想用一种更简洁优雅的方式,而且它需要是动态的,因为我不能确切地知道它会有多少组字典或多少字母。

我尝试了foreach方法,但我不能真正理解如何在每个循环中只获取每个字典的位置值。

var formatedDataList = new Dictionary<string, decimal>();
foreach (KeyValuePair<string, Dictionary<string, string>> group in fortmatedData)
{
    foreach (KeyValuePair<string, string> alternative in group.Value)
    {
        ...
    }
}

有人能帮我吗?


共2个答案

匿名用户

您可以使用LINQ:

var formatedDataList = fortmatedData
    .SelectMany(kvp => kvp.Value) // Flatten nested dictionaries
    .GroupBy(kvp => kvp.Key)
    .ToDictionary(grp => grp.Key, grp => grp.Sum(kvp => kvp.Value));

匿名用户

只需迭代内部字典,如果不存在则添加一个键:

dict.Aggregate(new Dictionary<string, double>(), (x, y) => {
    foreach (var kvp in y.Value) {
        x[kvp.Key] = (x.TryGetValue(kvp.Key, out var sum) ? sum : 0) + kvp.Value;
    }
    return x;
});

该解的复杂度比分组解小3倍。可用于较大的数据集。