2008-09-17 21 views

Respuesta

15

No hay nada de malo con un bucle for/foreach. Eso es todo lo que un método hipotético de AddRange haría de todos modos.

La única preocupación adicional que tengo es con el comportamiento de asignación de memoria, porque agregar una gran cantidad de entradas podría causar múltiples reasignaciones y nuevas operaciones. No hay forma de aumentar la capacidad de un diccionario existente en una cantidad determinada. Sería mejor que asignaras un nuevo diccionario con suficiente capacidad para los dos actuales, pero aún necesitarías un bucle para cargar al menos uno de ellos.

18

Existe el constructor Dictionary que toma otro Dictionary.

Tendrá que echarlo IDictionary, pero hay una sobrecarga Add() que toma KeyValuePair<TKey, TValue>. Sin embargo, todavía estás usando foreach.

+2

Gracias por la respuesta, pero ambos tienen elementos en los diccionarios ellos en el punto que tengo que hacer la copia. – Helephant

0

Si usted está tratando con dos objetos existentes, es posible obtener algún provecho con el método CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Utilice el método Add de la colección de otra (receptor) de absorberlos.

+0

¿No pude encontrar un método Agregar para el diccionario que tomaría una matriz? – Helephant

0

No entiendo, por qué no usar el Diccionario (Diccionario) (como lo sugiere ageektrapped).

¿Desea realizar una copia superficial o una copia profunda? (Es decir, ambos Diccionarios apuntando a las mismas referencias o nuevas copias de todos los objetos en el interior del nuevo diccionario?)

Si desea crear un diccionario nueva señalando nuevos objetos, creo que la única manera es a través de foreach.

+0

La copia superficial está bien. Tengo dos diccionarios que estoy rellenando en un método y quiero copiar el segundo diccionario más pequeño en el primero al final del método. Necesito mantenerlos separados durante la vida del método porque significan cosas diferentes. – Helephant

3

Por diversión, creé este método de extensión para el diccionario. Esto debería hacer una copia profunda siempre que sea posible.

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 >() ;

se puede pasar Diccionario animales existente para el constructor.

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

Cuestiones relacionadas