¿Cuál es la mejor manera de clonar/copiar en profundidad un diccionario genérico .NET <cadena, T>?

Resuelto mikeymo asked hace 15 años • 14 respuestas

Tengo un diccionario genérico Dictionary<string, T>del que básicamente me gustaría hacer un Clon() de...cualquier sugerencia.

mikeymo avatar Sep 26 '08 20:09 mikeymo
Aceptado

(Nota: aunque la versión de clonación es potencialmente útil, para una copia superficial simple, el constructor que menciono en la otra publicación es una mejor opción).

¿Qué profundidad desea que tenga la copia y qué versión de .NET está utilizando? Sospecho que una llamada LINQ a ToDictionary, especificando tanto la clave como el selector de elementos, será la forma más fácil de hacerlo si estás usando .NET 3.5.

Por ejemplo, si no te importa que el valor sea un clon superficial:

var newDictionary = oldDictionary.ToDictionary(entry => entry.Key,
                                               entry => entry.Value);

Si ya ha obligado a T a implementar ICloneable:

var newDictionary = oldDictionary.ToDictionary(entry => entry.Key, 
                                               entry => (T) entry.Value.Clone());

(No se han probado, pero deberían funcionar).

Jon Skeet avatar Sep 26 '2008 13:09 Jon Skeet

Bien, el .NET 2.0 responde:

Si no necesita clonar los valores, puede usar la sobrecarga del constructor para Diccionario que toma un IDictionary existente. (También puede especificar el comparador como comparador del diccionario existente).

Si necesita clonar los valores, puede usar algo como esto:

public static Dictionary<TKey, TValue> CloneDictionaryCloningValues<TKey, TValue>
   (Dictionary<TKey, TValue> original) where TValue : ICloneable
{
    Dictionary<TKey, TValue> ret = new Dictionary<TKey, TValue>(original.Count,
                                                            original.Comparer);
    foreach (KeyValuePair<TKey, TValue> entry in original)
    {
        ret.Add(entry.Key, (TValue) entry.Value.Clone());
    }
    return ret;
}

TValue.Clone()Por supuesto, eso también depende de que sea un clon suficientemente profundo.

Jon Skeet avatar Sep 26 '2008 14:09 Jon Skeet