两个字典<TKey, TValue> 到字典<TKey, List<TValue>> 的并集

Posted

技术标签:

【中文标题】两个字典<TKey, TValue> 到字典<TKey, List<TValue>> 的并集【英文标题】:Union of two Dictionaries<TKey, TValue> to Dictionary<TKey, List<TValue>> 【发布时间】:2021-06-12 13:50:20 【问题描述】:

我想找到两个字典的并集,它们可能包含相同的键,但值不同。 如果两个字典中都存在键,那么我想将值(如果它们不同)合并到列表中。 如果键只存在于一个字典中,那么我想创建一个列表并将该项目添加到其中。

所以,例如:

var dict1 = new Dictionary<int, string>();
var dict2 = new Dictionary<int, string>();

dict1.Add(1, "a");
dict2.Add(1, "b");
dict1.Add(2, "c");

var resultDict = Combine(dict1, dict2);

结果字典将是 Dictionary 的类型,并且将包含 1: ["a", "b"], 2: ["c"]。

我能想到的最简单的解决方案是遍历键并添加空列表,然后遍历两个字典并将所有值添加到给定键的列表中。

有没有什么好的、实用的解决方案可以将这两个字典结合起来?

【问题讨论】:

你检查过这个吗? Similar topic @startresse: 相关但不重复,因为这些问题想要创建一个合并的 Dictionary&lt;TKey, TValue&gt; 而这个问题想要一个 Dictionary&lt;TKey, List&lt;TValue&gt;&gt; 并且没有答案显示它。 【参考方案1】:

如果我想合并两个以上的字典怎么办?

您可以使用以下方法,该方法还显示了如何选择性地为键传递自定义比较器(例如,如果键是您想要以不区分大小写的方式比较的字符串):

public static Dictionary<TKey, List<TValue>> Combine<TKey, TValue>(
    IEqualityComparer<TKey> comparer = null,
    params IDictionary<TKey, TValue>[] dictionaries)

    if (comparer == null) comparer = EqualityComparer<TKey>.Default;
    Dictionary<TKey, List<TValue>> result = new Dictionary<TKey, List<TValue>>(comparer);
    IEnumerable<TKey> allKeys = dictionaries.SelectMany(dict => dict.Keys).Distinct(comparer);
    foreach (TKey key in allKeys)
    
        List<TValue> list = new List<TValue>();
        foreach (IDictionary<TKey, TValue> dict in dictionaries)
        
            if (dict.TryGetValue(key, out TValue value)) list.Add(value);
        
        result.Add(key, list);
    

    return result;

如果要使用默认比较器,则为比较器传递 null:

Dictionary<int, List<string>> resultDict = Combine(null, dict1, dict2, dict3);

【讨论】:

好的,没错。这种方法是否有任何扩展可以让我组合两个以上的字典?抱歉,如果这无关紧要,但我是 C# 新手。 @SzymonŻak:向您展示了一种方法,现在作为非扩展方法

以上是关于两个字典<TKey, TValue> 到字典<TKey, List<TValue>> 的并集的主要内容,如果未能解决你的问题,请参考以下文章

Dictionary<TKey, TValue> 中的散列过程是如何工作的

C# 6 元组特性应用:方便的字典工厂方法

将 Dictionary<TKey, List<TValue>> 转换为 ReadOnlyDictionary<TKey, ReadOnlyCollection<T

.NET 4 中的 IDictionary<TKey, TValue> 不是协变的

ConcurrentDictionary与Dictionary

为啥 Dictionary<TKey, TValue> 上的这个 Linq 查询不能作为数据源工作