在C#中将值和键从一个字典复制到另一个字典的最快方法是什么?

问题描述:

似乎没有dictionary.AddRange()方法。有没有人知道更好的方式来复制项目到另一个字典,而不使用foreach循环。在C#中将值和键从一个字典复制到另一个字典的最快方法是什么?

我在使用System.Collections.Generic.Dictionary。这是针对.NET 2.0的。

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

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

Dictionary构造函数需要另一个Dictionary

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

+2

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

如果你处理的两个现有对象,你可能会得到一些具有里程CopyTo方法:http://msdn.microsoft.com/en-us/library/cc645053.aspx

使用其他集合(接收器),以吸收他们的Add方法。

+0

我无法找到一个字典的添加方法,将采取数组? – Helephant 2008-09-17 10:08:09

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

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

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

+0

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

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

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; 
     } 

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

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

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