似乎没有 dictionary.AddRange() 方法。有谁知道在不使用 foreach 循环的情况下将项目复制到另一个字典的更好方法。
我正在使用 System.Collections.Generic.Dictionary。这适用于 .NET 2.0。
似乎没有 dictionary.AddRange() 方法。有谁知道在不使用 foreach 循环的情况下将项目复制到另一个字典的更好方法。
我正在使用 System.Collections.Generic.Dictionary。这适用于 .NET 2.0。
有一个Dictionary
构造函数需要另一个Dictionary
.
你必须强制转换它IDictionary
,但是有一个Add()
重载需要KeyValuePair<TKey, TValue>
. 不过,您仍在使用 foreach。
for/foreach 循环没有任何问题。无论如何,这都是假设的 AddRange 方法。
我唯一需要担心的是内存分配行为,因为添加大量条目可能会导致多次重新分配和重新散列。没有办法将现有字典的容量增加给定的数量。您最好为当前的两个字典分配一个具有足够容量的新字典,但您仍然需要一个循环来加载其中至少一个。
var Animal = new Dictionary<string, string>();
可以将现有的动物字典传递给构造函数。
Dictionary<string, string> NewAnimals = new Dictionary<string, string>(Animal);
为了好玩,我为字典创建了这个扩展方法。这应该尽可能地进行深层复制。
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;
}
如果您正在处理两个现有对象,您可能会使用 CopyTo 方法获得一些好处:http: //msdn.microsoft.com/en-us/library/cc645053.aspx
使用其他集合(接收者)的 Add 方法来吸收它们。
我不明白,为什么不使用 Dictionary( Dictionary ) (如 ageektrapped 所建议的那样)。
您要执行浅拷贝还是深拷贝?(也就是说,两个字典都指向新字典中每个对象的相同引用或新副本?)
如果您想创建一个指向新对象的新Dictionary ,我认为唯一的方法是通过foreach。
对于原始类型字典:
public void runIntDictionary()
{
Dictionary<int, int> myIntegerDict = new Dictionary<int, int>() { { 0, 0 }, { 1, 1 }, { 2, 2 } };
Dictionary<int, int> cloneIntegerDict = new Dictionary<int, int>();
cloneIntegerDict = myIntegerDict.Select(x => x.Key).ToList().ToDictionary<int, int>(x => x, y => myIntegerDict[y]);
}
或使用实现 ICloneable 的对象:
public void runObjectDictionary()
{
Dictionary<int, number> myDict = new Dictionary<int, number>() { { 3, new number(3) }, { 4, new number(4) }, { 5, new number(5) } };
Dictionary<int, number> cloneDict = new Dictionary<int, number>();
cloneDict = myDict.Select(x => x.Key).ToList().ToDictionary<int, number>(x => x, y => myDict[y].Clone());
}
public class number : ICloneable
{
public number()
{
}
public number(int newNumber)
{
nr = newnumber;
}
public int nr;
public object Clone()
{
return new number() { nr = nr };
}
public override string ToString()
{
return nr.ToString();
}
}