Tengo un diccionario genérico Dictionary<string, T>
que me gustaría hacer esencialmente un Clon () de ... cualquier sugerencia.
c#
generics
collections
clone
mikeymo
fuente
fuente
entry.Value
valor podría ser otra [sub] colección.Clone()
método si es profundo o poco profundo. He añadido una nota a tal efecto.ConcurrentDictionary
.(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é tan profunda desea que sea la copia y qué versión de .NET está usando? Sospecho que una llamada LINQ a ToDictionary, que especifica tanto la clave como el selector de elementos, será la forma más fácil de hacerlo si está utilizando .NET 3.5.
Por ejemplo, si no le importa que el valor sea un clon superficial:
Si ya ha restringido a T para implementar ICloneable:
(Esos no han sido probados, pero deberían funcionar).
fuente
fuente
Para .NET 2.0, podría implementar una clase que herede
Dictionary
e implementeICloneable
.Luego puede clonar el diccionario simplemente llamando al
Clone
método. Por supuesto, esta implementación requiere que se implemente el tipo de valor del diccionarioICloneable
, pero de lo contrario, una implementación genérica no es práctica en absoluto.fuente
Esto funciona bien para mi
Como Tomer Wolberg describe en los comentarios, esto no funciona si el tipo de valor es una clase mutable.
fuente
Siempre puedes usar la serialización. Puede serializar el objeto y luego deserializarlo. Eso le dará una copia profunda del Diccionario y todos los elementos que contiene. Ahora puede crear una copia profunda de cualquier objeto que esté marcado como [Serializable] sin escribir ningún código especial.
Aquí hay dos métodos que utilizarán la serialización binaria. Si usa estos métodos, simplemente llame
fuente
La mejor manera para mí es esta:
fuente
El método de serialización binaria funciona bien, pero en mis pruebas demostró ser 10 veces más lento que una implementación de clon sin serialización. Probado en
Dictionary<string , List<double>>
fuente
ToBinary()
elSerialize()
método se llama con enthis
lugar deyourDictionary
. Luego, enFromBinary()
el byte [] se copia primero manualmente en MemStream, pero solo se puede suministrar a su constructor.Eso es lo que me ayudó, cuando estaba tratando de copiar en profundidad un Diccionario <string, string>
Buena suerte
fuente
Pruebe esto si la clave / valores son ICloneable:
fuente
Respondiendo en una publicación anterior, sin embargo, me pareció útil envolverlo de la siguiente manera:
fuente