在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并不重要。
3 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
这部分取决于你遇到重复的事情。例如,你可以这样做:
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,并意识到字典支持迭代其键/值对。
幕布斯6054654
TA贡献1876条经验 获得超7个赞
我会这样做:
dictionaryFrom.ToList().ForEach(x => dictionaryTo.Add(x.Key, x.Value));
简单易行。根据这篇博客文章,它比大多数循环更快,因为它的底层实现通过索引而不是枚举器访问元素(参见本答案)。
如果存在重复,它当然会抛出异常,因此您必须在合并之前进行检查。
森栏
TA贡献1810条经验 获得超5个赞
好吧,我迟到了,但这是我用的。如果有多个键(“righter”键替换“lefter”键),它不会爆炸,可以合并多个词典(如果需要)并保留类型(限制它需要一个有意义的默认公共构造函数):
public static class DictionaryExtensions{ // Works in C#3/VS2008: // Returns a new dictionary of this ... others merged leftward. // Keeps the type of 'this', which must be default-instantiable. // Example: // result = map.MergeLeft(other1, other2, ...) public static T MergeLeft<T,K,V>(this T me, params IDictionary<K,V>[] others) where T : IDictionary<K,V>, new() { T newMap = new T(); foreach (IDictionary<K,V> src in (new List<IDictionary<K,V>> { me }).Concat(others)) { // ^-- echk. Not quite there type-system. foreach (KeyValuePair<K,V> p in src) { newMap[p.Key] = p.Value; } } return newMap; }}
- 3 回答
- 0 关注
- 593 浏览
添加回答
举报
0/150
提交
取消