J'ai un dictionnaire générique Dictionary<string, T>
que je voudrais essentiellement faire un clone () de .. toutes les suggestions.
c#
generics
collections
clone
mikeymo
la source
la source
entry.Value
valeur peut être encore une autre [sous] collection.Clone()
méthode si elle est profonde ou peu profonde. J'ai ajouté une note à cet effet.ConcurrentDictionary
.(Remarque: bien que la version de clonage soit potentiellement utile, pour une simple copie superficielle, le constructeur que je mentionne dans l'autre post est une meilleure option.)
Quelle profondeur souhaitez-vous que la copie soit et quelle version de .NET utilisez-vous? Je soupçonne qu'un appel LINQ à ToDictionary, spécifiant à la fois la clé et le sélecteur d'élément, sera le moyen le plus simple si vous utilisez .NET 3.5.
Par exemple, si cela ne vous dérange pas que la valeur soit un clone peu profond:
Si vous avez déjà contraint T à implémenter ICloneable:
(Ceux-ci ne sont pas testés, mais devraient fonctionner.)
la source
la source
Pour .NET 2.0, vous pouvez implémenter une classe qui hérite de
Dictionary
et implémenteICloneable
.Vous pouvez ensuite cloner le dictionnaire simplement en appelant la
Clone
méthode. Bien sûr, cette implémentation nécessite que le type de valeur du dictionnaire implémenteICloneable
, mais sinon une implémentation générique n'est pas du tout pratique.la source
Cela fonctionne bien pour moi
Comme Tomer Wolberg le décrit dans les commentaires, cela ne fonctionne pas si le type de valeur est une classe mutable.
la source
Vous pouvez toujours utiliser la sérialisation. Vous pouvez sérialiser l'objet puis le désérialiser. Cela vous donnera une copie complète du dictionnaire et de tous les éléments qu'il contient. Vous pouvez maintenant créer une copie complète de tout objet marqué comme [Sérialisable] sans écrire de code spécial.
Voici deux méthodes qui utiliseront la sérialisation binaire. Si vous utilisez ces méthodes, vous appelez simplement
la source
La meilleure façon pour moi est la suivante:
la source
La méthode de sérialisation binaire fonctionne bien, mais dans mes tests, elle s'est révélée 10 fois plus lente qu'une implémentation de non-sérialisation de clone. Testé sur
Dictionary<string , List<double>>
la source
ToBinary()
laSerialize()
méthode est appelée avecthis
au lieu deyourDictionary
. Ensuite, dansFromBinary()
l'octet [] est d'abord copié manuellement sur le MemStream mais il peut simplement être fourni à son constructeur.C'est ce qui m'a aidé, lorsque j'essayais de copier en profondeur un dictionnaire <chaîne, chaîne>
Bonne chance
la source
Essayez ceci si les clés / valeurs sont IClonables:
la source
En répondant à un ancien post, j'ai trouvé utile de le résumer comme suit:
la source