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

Sta*_*ful 4 c# dictionary

INPUT

字典1

"a","1"

"b","2"

字典2

"a","3"

"b","4"

字典3

"a","5"

"b","6"

OUTPUT(上面的词典的连接)

最后的字典

"a","9"

"b","12"

我写了一个伪代码:

  1. 创建一个Final空字典.
  2. 循环遍历词典列表.
  3. 遍历KeyValue对.
  4. 检查密钥是否存在于最终字典中.如果是,则将KeyValue对中的值添加到final字典中.如果没有,则将KeyValue对添加到字典中

由于这需要两个foreach循环,因此c#中有一个lync版本,并且不会抛出任何异常.

我在stackoverflow上提到的一些问题是将多个字典组合成一个字典

Ese*_*ser 10

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));
Run Code Online (Sandbox Code Playgroud)


Mar*_*age 9

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

此解决方案适用于任意数量的字典 - 而不仅仅是一组固定的字典。