小编典典

在 C# 中合并字典

all

Dictionary<T1,T2>在 C#中合并 2 个或多个字典 ( ) 的最佳方法是什么?(像 LINQ 这样的 3.0 特性很好)。

我正在考虑一个方法签名:

public static Dictionary<TKey,TValue>
                 Merge<TKey,TValue>(Dictionary<TKey,TValue>[] dictionaries);

要么

public static Dictionary<TKey,TValue>
                 Merge<TKey,TValue>(IEnumerable<Dictionary<TKey,TValue>> dictionaries);

编辑: 从 JaredPar 和 Jon Skeet
那里得到了一个很酷的解决方案,但我正在考虑处理重复键的东西。在发生冲突的情况下,将哪个值保存到字典中并不重要,只要它是一致的即可。


阅读 194

收藏
2022-03-07

共1个答案

小编典典

这部分取决于您遇到重复项时想要发生的情况。例如,您可以这样做:

var result = dictionaries.SelectMany(dict => dict)
                         .ToDictionary(pair => pair.Key, pair => pair.Value);

如果您获得任何重复的键,那将引发异常。

编辑:如果你使用 ToLookup 那么你会得到一个查找,每个键可以有多个值。然后,您 可以 将其转换为字典:

var result = dictionaries.SelectMany(dict => dict)
                         .ToLookup(pair => pair.Key, pair => pair.Value)
                         .ToDictionary(group => group.Key, group => group.First());

这有点难看——而且效率低下——但就代码而言,这是最快的方法。(诚​​然,我没有测试过它。)

当然,您可以编写自己的 ToDictionary2
扩展方法(使用更好的名称,但我现在没有时间想一个)——这并不难,只需覆盖(或忽略)重复键。重要的一点(在我看来)是使用SelectMany,并意识到字典支持对其键/值对的迭代。

2022-03-07