Dictionary<T1,T2>在 C#中合并 2 个或多个字典 ( ) 的最佳方法是什么?(像 LINQ 这样的 3.0 特性很好)。
Dictionary<T1,T2>
我正在考虑一个方法签名:
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 那里得到了一个很酷的解决方案,但我正在考虑处理重复键的东西。在发生冲突的情况下,将哪个值保存到字典中并不重要,只要它是一致的即可。
这部分取决于您遇到重复项时想要发生的情况。例如,您可以这样做:
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,并意识到字典支持对其键/值对的迭代。
SelectMany