我有一本字典,它的结构如下:
{
"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)
{
...
}
}
有人能帮我吗?
您可以使用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倍。可用于较大的数据集。