Eu tenho um dicionário genérico Dictionary<string, T>
que eu gostaria de essencialmente fazer um Clone () de ..qualquer sugestão.
c#
generics
collections
clone
mikeymo
fonte
fonte
entry.Value
valor pode ser mais uma [sub] coleção.Clone()
método, seja profundo ou superficial. Eu adicionei uma nota para esse efeito.ConcurrentDictionary
.(Nota: embora a versão de clonagem seja potencialmente útil, para uma cópia superficial simples, o construtor que mencionei no outro post é uma opção melhor.)
Qual a profundidade da cópia e qual versão do .NET você está usando? Suspeito que uma chamada LINQ para o ToDictionary, especificando o seletor de chave e elemento, seja o caminho mais fácil, se você estiver usando o .NET 3.5.
Por exemplo, se você não se importa com o valor de ser um clone superficial:
Se você já restringiu o T a implementar o ICloneable:
(Eles não foram testados, mas devem funcionar.)
fonte
fonte
Para o .NET 2.0, você pode implementar uma classe que herda
Dictionary
e implementaICloneable
.Você pode clonar o dicionário simplesmente chamando o
Clone
método É claro que essa implementação exige que o tipo de valor do dicionário implementeICloneable
, mas, caso contrário, uma implementação genérica não é prática.fonte
Este trabalho é bom para mim
Como Tomer Wolberg descreve nos comentários, isso não funciona se o tipo de valor for uma classe mutável.
fonte
Você sempre pode usar serialização. Você pode serializar o objeto e desserializá-lo. Isso fornecerá uma cópia detalhada do dicionário e de todos os itens dentro dele. Agora você pode criar uma cópia profunda de qualquer objeto que esteja marcado como [Serializable] sem escrever nenhum código especial.
Aqui estão dois métodos que usarão serialização binária. Se você usar esses métodos, basta chamar
fonte
A melhor maneira para mim é esta:
fonte
O método de serialização binária funciona bem, mas nos meus testes ele mostrou ser 10 vezes mais lento que uma implementação de clone sem serialização. Testado em
Dictionary<string , List<double>>
fonte
ToBinary()
noSerialize()
método é chamado comthis
em vez deyourDictionary
. Em seguida, noFromBinary()
byte [] é copiado manualmente manualmente para o MemStream, mas pode ser fornecido apenas ao seu construtor.Foi isso que me ajudou, quando eu estava tentando copiar profundamente um Dictionary <string, string>
Boa sorte
fonte
Tente isso se os valores / chave forem ICloneable:
fonte
Respondendo a post antigo, no entanto, achei útil envolvê-lo da seguinte maneira:
fonte