用C#将值和键从一个字典复制到另一个字典中的最快方法是什么?
时间:2020-03-05 18:58:26 来源:igfitidea点击:
似乎没有dictionary.AddRange()方法。有谁知道一种更好的方式而不使用foreach循环将项目复制到另一本词典。
我正在使用System.Collections.Generic.Dictionary。这是用于.NET 2.0。
解决方案
回答
有Dictionary
构造函数需要另一个Dictionary
。
我们必须将其强制转换为IDictionary,但是Add()重载将采用KeyValuePair <TKey,TValue>。但是,我们仍在使用foreach。
回答
如果要处理两个现有对象,则使用CopyTo方法可能会有所帮助:http://msdn.microsoft.com/zh-cn/library/cc645053.aspx
使用其他集合(接收者)的Add方法吸收它们。
回答
我不明白,为什么不使用Dictionary(Dictionary)(如ageektrapped所建议)。
我们要执行"浅复制"还是"深复制"? (也就是说,两个Dictionary是否都指向新字典中每个对象的相同引用或者新副本?)
如果要创建一个指向新对象的新Dictionary,我认为唯一的方法是通过foreach。
回答
for / foreach循环没有错。无论如何,这就是假设的AddRange方法要做的全部。
我唯一需要担心的是内存分配行为,因为添加大量条目可能会导致多个重新分配和重新哈希。无法通过给定数量增加现有词典的容量。我们最好为两个当前字典分配一个具有足够容量的新字典,但是我们仍然需要循环才能加载其中至少一个。
回答
为了好玩,我创建了字典的扩展方法。这应该尽可能进行深层复制。
public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary<TKey, TValue> dictionary) { Dictionary<TKey, TValue> d2 = new Dictionary<TKey, TValue>(); bool keyIsCloneable = default(TKey) is ICloneable; bool valueIsCloneable = default(TValue) is ICloneable; foreach (KeyValuePair<TKey, TValue> kvp in dictionary) { TKey key = default(TKey); TValue value = default(TValue); if (keyIsCloneable) { key = (TKey)((ICloneable)(kvp.Key)).Clone(); } else { key = kvp.Key; } if (valueIsCloneable) { value = (TValue)((ICloneable)(kvp.Value)).Clone(); } else { value = kvp.Value; } d2.Add(key, value); } return d2; }