J'ai un dictionnaire de dictionnaire générique que je voudrais essentiellement faire un Clone () de .any suggestions.
Réponses
Trop de publicités?(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.)
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;
}
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.
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