将多个具有相同关键字的字典合并为一个具有值总和的字典
本文关键字:字典 一个 和的 合并 关键字 | 更新日期: 2023-09-27 18:08:59
输入
字典1
"a"、"1">
"b"、"2">
字典2
"a"、"3">
"b"、"4">
字典3
"a"、"5">
"b"、"6">
OUTPUT(上面字典的级联(
最终字典
"a"、"9">
"b"、"12">
我为此写了一个伪代码:
- 创建一个Final空字典
- 循环浏览字典列表
- 在KeyValue对上循环
- 检查最终字典中是否存在该键。如果是,则将KeyValue对中的值添加到最终字典中。如果没有,则将KeyValue对添加到字典中
由于这需要两个foreach循环,所以c#中有一个lync版本,它也不会抛出任何异常。
我在stackoverflow上提到的一些问题是将多个字典合并为一个字典
var dict1 = new Dictionary<string, int>() { { "a", 1 }, { "b", 2 } };
var dict2 = new Dictionary<string, int>() { { "a", 3 }, { "b", 4 } };
var dict3 = new Dictionary<string, int>() { { "a", 5 }, { "b", 6 } };
var resDict = dict1.Concat(dict2)
.Concat(dict3)
.GroupBy(x => x.Key)
.ToDictionary(x => x.Key, x => x.Sum(y=>y.Value));
您可以使用SelectMany
将每个字典中的所有键值对连接到一个序列中,然后可以按键对其进行分组,并对每个键的值求和以确定最终值:
var dictionaries = new[] {
new Dictionary<String, Int32>() { { "a", 1 }, { "b", 2 } },
new Dictionary<String, Int32>() { { "a", 3 }, { "b", 4 } },
new Dictionary<String, Int32>() { { "a", 5 }, { "b", 6 } }
};
var result = dictionaries
.SelectMany(d => d)
.GroupBy(
kvp => kvp.Key,
(key, kvps) => new { Key = key, Value = kvps.Sum(kvp => kvp.Value) }
)
.ToDictionary(x => x.Key, x => x.Value);
此解决方案适用于任意数量的词典,而不仅仅是固定的一组词典。