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

时间:2015-08-21 08:36:55

标签: c# dictionary

INPUT

词典1

  

" a"," 1"

     

" b"," 2"

词典2

  

" a"," 3"

     

" b"," 4"

词典3

  

" a"," 5"

     

" b"," 6"

OUTPUT(上面词典的连接)

最后的字典

  

" a"," 9"

     

" b"," 12"

我为此编写了一个伪代码:

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

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

    我在stackoverflow上提到的一些问题是Combine multiple dictionaries into a single dictionary

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:4)

您可以使用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);

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