将多个具有相同关键字的字典合并为一个具有值总和的字典

本文关键字:字典 一个 和的 合并 关键字 | 更新日期: 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">

我为此写了一个伪代码:

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

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