284 votes

Quel est le meilleur moyen de cloner / copier en profondeur un dictionnaire générique .NET? <string, T> ?

J'ai un dictionnaire de dictionnaire générique que je voudrais essentiellement faire un Clone () de .any suggestions.

292voto

Jon Skeet Points 692016

(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:

var newDictionary = oldDictionary.ToDictionary(entry => entry.Key,
                                               entry => entry.Value);

Si vous avez déjà limitée T pour mettre en œuvre ICloneable:

var newDictionary = oldDictionary.ToDictionary(entry => entry.Key, 
                                               entry => (T) entry.Value.Clone());

(Ceux qui ne sont pas testés, mais devrait fonctionner.)

210voto

Jon Skeet Points 692016

Ok, le .NET 2.0 répond:

Si vous n'avez pas besoin de cloner les valeurs, vous pouvez utiliser la surcharge constructeur dans Dictionnaire qui prend un IDictionary existant. (Vous pouvez également spécifier le comparateur en tant que comparateur de dictionnaire existant.)

Si vous avez besoin de cloner les valeurs, vous pouvez utiliser quelque chose comme ceci:

 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;
}
 

124voto

Herald Smit Points 187
Dictionary<string, int> dictionary = new Dictionary<string, int>();

Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);

11voto

Compile This Points 4684

Pour .NET 2.0, vous pouvez implémenter une classe qui hérite de Dictionary et implémente ICloneable .

 public class CloneableDictionary<TKey, TValue> : Dictionary<TKey, TValue> where TValue : ICloneable
{
    public IDictionary<TKey, TValue> Clone()
    {
    	CloneableDictionary<TKey, TValue> clone = new CloneableDictionary<TKey, TValue>();

    	foreach (KeyValuePair<TKey, TValue> pair in this)
    	{
    		clone.Add(pair.Key, (TValue)pair.Value.Clone());
    	}

    	return clone;
    }
}
 

Vous pouvez ensuite cloner le dictionnaire en appelant simplement la méthode Clone . Bien entendu, cette implémentation nécessite que le type de valeur du dictionnaire implémente ICloneable , mais sinon une implémentation générique n'est pas du tout pratique.

7voto

Shaun Bowe Points 3390

Vous pouvez toujours utiliser la sérialisation. Vous pouvez sérialiser l’objet puis désérialiser. Cela vous donnera une copie complète du dictionnaire et de tous les éléments à l’intérieur. Maintenant, vous pouvez créer une copie complète de tout objet qui est marquée avec l’attribut [Serializable] sans écrire de code spéciale.

Voici deux méthodes qui vont utiliser la sérialisation binaire. Si vous utilisez ces méthodes, qu'appelez simplement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X