c#将多个词典合并为一个

Tan*_*ngo 1 c# dictionary

首先,我想提一下,我几天前才开始学习C#,所以我对它的了解有限.

我正在将具有相同类型键值对的多个词典合并为一个词典.

以下是我的方法,它可以工作,也可以处理重复

 var result = dict1.Concat(dict2).GroupBy(d => d.Key)
              .ToDictionary(d => d.Key, d => d.First().Value);

            result = result.Concat(dict3).GroupBy(d => d.Key)
                .ToDictionary(d => d.Key, d => d.First().Value);

            result = result.Concat(dict4).GroupBy(d => d.Key)
                .ToDictionary(d => d.Key, d => d.First().Value);

            result = result.Concat(dict5).GroupBy(d => d.Key)
    .ToDictionary(d => d.Key, d => d.First().Value); 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种有效的方法来合并具有相同数据类型的键值对的多个字典.

Oli*_*bes 9

自字典实现以来IEnumerable<KeyValuePair<TKey, TValue>>,您可以简单地写:

var result = dict1
    .Concat(dict2)
    .Concat(dict3)
    .Concat(dict4)
    .Concat(dict5)
    .ToDictionary(e => e.Key, e => e.Value);
Run Code Online (Sandbox Code Playgroud)

这假设没有重复的密钥.

如果有重复的键,您可以获得每个键的第一个值

result = dict1
    .Concat(dict2)
    .Concat(dict3)
    .Concat(dict4)
    .Concat(dict5)
    .GroupBy(e => e.Key)
    .ToDictionary(g => g.Key, g => g.First().Value);
Run Code Online (Sandbox Code Playgroud)

可以想到其他变体,例如保持最大/最小值等.

如果存在具有不同值的重复键,您还可以创建值列表的字典

Dictionary<TKey, List<TValue>> result = dict1
    .Concat(dict2)
    .Concat(dict3)
    .Concat(dict4)
    .Concat(dict5)
    .GroupBy(e => e.Key, e => e.Value)
    .ToDictionary(g => g.Key, v => v.ToList());
Run Code Online (Sandbox Code Playgroud)

如果重复键的值始终相同,则只需使用List<T>而不是HashSet<T>:

var result = dict1
    .Union(dict2)
    .Union(dict3)
    .Union(dict4)
    .Union(dict5)
    .ToDictionary(e => e.Key, e => e.Value);
Run Code Online (Sandbox Code Playgroud)

Union产生两个序列的集合.Concat连接两个序列.

最后,您可以组合前面两种方法并丢弃相等的键/值对,但保留每个键的不同值列表:

Dictionary<TKey, List<TValue>> result = dict1
    .Union(dict2)
    .Union(dict3)
    .Union(dict4)
    .Union(dict5)
    .GroupBy(e => e.Key, e => e.Value)
    .ToDictionary(g => g.Key, v => v.ToList());
Run Code Online (Sandbox Code Playgroud)

这些示例表明,确切地了解输入数据的形状(唯一/非唯一键和键值对)以及您期望的结果类型非常重要.


另一种方法是让您的不同方法返回列表或枚举而不是字典,并在最后将这些集合合并到字典中.这会更有效.