将具有相同键的多个词典组合成一个具有值总和的字典

INPUT

字典1

“a”,“1”

“b”,“2”

字典2

“a”,“3”

“b”,“4”

字典3

“a”,“5”

“b”,“6”

输出(上面的词典的连接)

最后的字典

“a”,“9”

“b”,“12”

我写了一个伪代码:

  1. 创建一个Final空字典。
  2. 循环遍历词典列表。
  3. 遍历KeyValue对。
  4. 检查密钥是否存在于最终字典中。 如果是,则将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));