似乎没有dictionary.AddRange()方法。 有谁知道一种更好的方式而不使用foreach循环将项目复制到另一本词典。
我正在使用System.Collections.Generic.Dictionary。 这是用于.NET 2.0。
Dictionary构造函数带有另一个Dictionary。
您必须将其强制转换为IDictionary,但是有一个Add()重载占用了KeyValuePair。但是,您仍在使用foreach。
for / foreach循环没有错。假设的方法AddRange都是这样。
我唯一需要担心的是内存分配行为,因为添加大量条目可能会导致多个重新分配和重新哈希。无法通过给定数量增加现有词典的容量。您最好为两个当前词典分配足够的容量来分配一个新的Dictionary,但是您仍然需要循环才能加载至少其中一个。
1
| var Animal = new Dictionary<string, string>(); |
可以将现有的动物词典传递给构造函数。
1
| Dictionary<string, string> NewAnimals = new Dictionary<string, string>(Animal); |
为了好玩,我创建了这个扩展方法到字典。这应该尽可能进行深层复制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 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;
} |
我不明白,为什么不使用Dictionary(Dictionary)(如ageektrapped所建议)。
您要执行浅拷贝还是深拷贝? (也就是说,两个Dictionary是否都指向新字典中每个对象的相同引用或新副本?)
如果要创建一个指向新对象的新Dictionary,我认为唯一的方法是通过foreach。
如果要处理两个现有对象,则使用CopyTo方法可能会有所帮助:http://msdn.microsoft.com/zh-cn/library/cc645053.aspx
使用其他集合(接收者)的Add方法吸收它们。