在C#中合并字典

在C#中合并字典

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得到一个很酷的解决方案,但我正在考虑处理重复键的东西。在发生碰撞的情况下,只要它是一致的,将哪个值保存到dict并不重要。


白衣染霜花
浏览 595回答 3
3回答

宝慕林4294392

这部分取决于你遇到重复的事情。例如,你可以这样做:var&nbsp;result&nbsp;=&nbsp;dictionaries.SelectMany(dict&nbsp;=>&nbsp;dict) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToDictionary(pair&nbsp;=>&nbsp;pair.Key,&nbsp;pair&nbsp;=>&nbsp;pair.Value);如果你得到任何重复的密钥,那将会爆炸。编辑:如果您使用ToLookup,那么您将获得一个查找,每个键可以有多个值。然后,您可以将其转换为字典:var&nbsp;result&nbsp;=&nbsp;dictionaries.SelectMany(dict&nbsp;=>&nbsp;dict) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToLookup(pair&nbsp;=>&nbsp;pair.Key,&nbsp;pair&nbsp;=>&nbsp;pair.Value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToDictionary(group&nbsp;=>&nbsp;group.Key,&nbsp;group&nbsp;=>&nbsp;group.First());这有点难看 - 而且效率低下 - 但这是在代码方面做到最快的方法。(诚然,我没有测试过。)您当然可以编写自己的ToDictionary2扩展方法(名称更好,但我现在没有时间考虑一个) - 这不是很难做,只是覆盖(或忽略)重复键。重要的一点(在我看来)是使用SelectMany,并意识到字典支持迭代其键/值对。

幕布斯6054654

我会这样做:dictionaryFrom.ToList().ForEach(x => dictionaryTo.Add(x.Key, x.Value));简单易行。根据这篇博客文章,它比大多数循环更快,因为它的底层实现通过索引而不是枚举器访问元素(参见本答案)。如果存在重复,它当然会抛出异常,因此您必须在合并之前进行检查。

森栏

好吧,我迟到了,但这是我用的。如果有多个键(“righter”键替换“lefter”键),它不会爆炸,可以合并多个词典(如果需要)并保留类型(限制它需要一个有意义的默认公共构造函数):public&nbsp;static&nbsp;class&nbsp;DictionaryExtensions{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Works&nbsp;in&nbsp;C#3/VS2008: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Returns&nbsp;a&nbsp;new&nbsp;dictionary&nbsp;of&nbsp;this&nbsp;...&nbsp;others&nbsp;merged&nbsp;leftward. &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Keeps&nbsp;the&nbsp;type&nbsp;of&nbsp;'this',&nbsp;which&nbsp;must&nbsp;be&nbsp;default-instantiable. &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Example:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;map.MergeLeft(other1,&nbsp;other2,&nbsp;...) &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;T&nbsp;MergeLeft<T,K,V>(this&nbsp;T&nbsp;me,&nbsp;params&nbsp;IDictionary<K,V>[]&nbsp;others) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;T&nbsp;:&nbsp;IDictionary<K,V>,&nbsp;new() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;newMap&nbsp;=&nbsp;new&nbsp;T(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(IDictionary<K,V>&nbsp;src&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(new&nbsp;List<IDictionary<K,V>>&nbsp;{&nbsp;me&nbsp;}).Concat(others))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;^--&nbsp;echk.&nbsp;Not&nbsp;quite&nbsp;there&nbsp;type-system. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(KeyValuePair<K,V>&nbsp;p&nbsp;in&nbsp;src)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newMap[p.Key]&nbsp;=&nbsp;p.Value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;newMap; &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP