¿Cuál es la mejor manera de clonar/copiar en profundidad un diccionario genérico .NET <cadena, T>?
Tengo un diccionario genérico Dictionary<string, T>
del que básicamente me gustaría hacer un Clon() de...cualquier sugerencia.
(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).
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.