2008-09-17 90 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);

相關問題