2008-09-17 146 views

回答

15

for/foreach循环没有问题。无论如何,这都是假设的AddRange方法。

我唯一需要关心的是内存分配行为,因为添加大量的条目可能会导致多次重新分配和重新哈希。没有办法增加给定量的现有字典的容量。你可能会更好地分配一个具有足够容量的新字典,但是你仍然需要一个循环来加载至少其中的一个字典。

18

Dictionary构造函数需要另一个Dictionary

你必须投它IDictionary,但有Add()过载需要KeyValuePair<TKey, TValue>。不过,你仍然在使用foreach。

+2

感谢您的回答,但两者的字典必须在我需要做副本的点,他们的项目。 – Helephant 2008-09-17 09:54:15

0

我不明白,为什么不使用词典(词典)(由ageektrapped建议)。

是否要执行浅拷贝或深拷贝? (也就是说,两个词典都指向新的字典内的每个对象的同一引用或新副本?)

如果你想创建一个字典指着对象,我认为唯一的出路是通过foreach

+0

浅拷贝是好的。我有两个字典,我在一个方法中填充,我想将第二个较小的字典复制到方法结尾的第一个字典中。我需要在方法的生命周期中将它们分开,因为它们意味着不同的事情。 – Helephant 2008-09-17 10:05:15

3

为了好玩,我创建了这个扩展方法到字典。这应该尽可能进行深层复制。

public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary&lt;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; 
     } 
3

var Animal = new Dictionary < string, string >() ;

一个可以通过现有的动物字典给构造。

Dictionary< string, string > NewAnimals = new Dictionary< string, string >(Animal);

相关问题