Quelle est la meilleure façon de clone/copie en profondeur un .NET Dictionnaire générique<string, T>?
J'ai un dictionnaire générique Dictionary<string, T>
que je tiens essentiellement à faire un Clone() de ..des suggestions.
Vous devez vous connecter pour publier un commentaire.
D'accord, l' .NET 2.0 réponses:
Si vous n'avez pas besoin de cloner les valeurs, vous pouvez utiliser le constructeur de la surcharge Dictionnaire qui prend un existant IDictionary. (Vous pouvez spécifier le comparer à l'existant dictionnaire de comparer, aussi.)
Si vous ne besoin de cloner les valeurs, vous pouvez utiliser quelque chose comme ceci:
Qui s'appuie sur
TValue.Clone()
être suffisamment profonde clone aussi, bien entendu.entry.Value
la valeur pourrait être encore un autre [sub]collection.Clone()
méthode si elle est profonde ou peu profonde. J'ai ajouté une note à cet effet.ConcurrentDictionary
.(Remarque: bien que le clonage version est potentiellement utile, pour une simple copie du constructeur que je mentionne dans l'autre post est une meilleure option.)
Quelle profondeur vous voulez que la copie soit, et quelle version de .NET vous aide? Je soupçonne qu'un LINQ appel à ToDictionary, en précisant à la fois la clé et le sélecteur d'élément, sera le moyen le plus facile pour aller si vous êtes en utilisant .NET 3.5.
Par exemple, si vous n'avez pas l'esprit la valeur d'être un clone simple:
Si vous avez déjà limitée T pour mettre en œuvre ICloneable:
(Ceux qui ne sont pas testés, mais devrait fonctionner.)
Pour .NET 2.0 vous pouvez implémenter une classe qui hérite de
Dictionary
et met en œuvreICloneable
.Vous pouvez ensuite cloner le dictionnaire en appelant simplement la
Clone
méthode. Bien sûr, cette mise en œuvre nécessite que le type de valeur de la dictionnaire met en œuvreICloneable
, mais sinon, une implémentation générique n'est pas pratique du tout.Vous pouvez toujours utiliser la sérialisation. Vous pourriez sérialiser l'objet puis de le désérialiser. Qui vous donnera une copie du Dictionnaire et de tous les éléments à l'intérieur d'elle. Maintenant, vous pouvez créer une copie de n'importe quel objet qui est marqué comme [Serializable] sans écrire aucun code particulier.
Voici deux méthodes qui leur permettront d'utiliser la Sérialisation Binaire. Si vous utilisez ces méthodes vous suffit d'appeler
Méthode de Sérialisation binaire fonctionne très bien mais dans mes tests, il a montré à être 10x plus lent qu'un non-sérialisation de mise en œuvre de clone. Testé sur
Dictionary<string , List<double>>
ToBinary()
laSerialize()
méthode est appelée avecthis
au lieu deyourDictionary
. Puis dansFromBinary()
le byte[] est d'abord copié manuellement à l'MemStream mais il peut juste être fourni à son constructeur.La meilleure façon pour moi, c'est ceci:
Cela fonctionne très bien pour moi
Que Tomer Wolberg décrit dans les commentaires, cela ne fonctionne pas si le type de valeur est un mutant de classe.
Essayer si la clé/valeurs sont ICloneable:
De répondre à vieux message mais j'ai trouvé utile pour l'envelopper comme suit: