将具有相同键的多个词典组合成一个具有值总和的字典
INPUT
字典1
“a”,“1”
“b”,“2”
字典2
“a”,“3”
“b”,“4”
字典3
“a”,“5”
“b”,“6”
输出(上面的词典的连接)
最后的字典
“a”,“9”
“b”,“12”
我写了一个伪代码:
- 创建一个Final空字典。
- 循环遍历词典列表。
- 遍历KeyValue对。
- 检查密钥是否存在于最终字典中。 如果是,则将KeyValue对中的值添加到final字典中。 如果没有,则将KeyValue对添加到字典中
由于这需要两个foreach循环,因此c#中有一个lync版本,并且不会抛出任何exception。
我在stackoverflow上提到的一些问题是将多个字典合并为一个字典
您可以使用SelectMany
将每个字典中的所有键值对连接成一个序列,然后您可以按键对其进行分组,并将每个键的值相加以确定最终值:
var dictionaries = new[] { new Dictionary() { { "a", 1 }, { "b", 2 } }, new Dictionary() { { "a", 3 }, { "b", 4 } }, new Dictionary() { { "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);
此解决方案适用于任意数量的词典 – 而不仅仅是固定的词典集。
var dict1 = new Dictionary() { { "a", 1 }, { "b", 2 } }; var dict2 = new Dictionary() { { "a", 3 }, { "b", 4 } }; var dict3 = new Dictionary() { { "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));