2011-07-08 1 views
0

L'instanciation OrderedDictionary est la suivante:Comment faire une copie en profondeur d'un OrderedDictionary en lecture seule avec des clés et des valeurs qui ne sont plus en lecture seule?

IOrderedDictionary orderedDictionary= gridview.DataKeys[index].Values; 

OrderedDictionary est en lecture seule.

Comment puis-je faire une copie profonde de orderedDictionary qui n'est pas en lecture seule? La sérialisation/désérialisation ne fonctionne pas car elle copie également la partie en lecture seule.

+0

Plutôt que r eprise une discussion de profondeur Je fournis un lien vers une vieille question http://stackoverflow.com/q/78536/659190 – Jodrell

Répondre

1

La façon la plus simple serait de simplement copier les objets:

var newDictionary = new OrderedDictionary(); 
foreach(DictionaryEntry de in orderedDictionary) 
{ 
    newDictionary.Add(de.Key, de.Value); 
} 

MISE À JOUR:
Ce code ne sera pas créer une copie profonde des valeurs dans le dictionnaire.
Exemple:

var orderedDictionary = new OrderedDictionary(); 
orderedDictionary.Add("1", new List<int> { 1, 2 }); 

var newDictionary = new OrderedDictionary(); 
foreach(DictionaryEntry de in orderedDictionary) 
{ 
    newDictionary.Add(de.Key, de.Value); 
} 

deux dictionnaire contient une entrée avec la touche « 1 » et la même liste. Supprimer un élément de cette liste dans l'un des dictionnaires modifiera également le contenu de la liste dans l'autre dictionnaire, car il n'y a qu'une seule liste.

Console.WriteLine(((List<int>)orderedDictionary["1"]).Count); 
Console.WriteLine(((List<int>)newDictionary["1"]).Count); 
Console.WriteLine(ReferenceEquals(orderedDictionary["1"], newDictionary["1"])); 
((List<int>)orderedDictionary["1"]).Remove(1); 
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count); 
Console.WriteLine(((List<int>)newDictionary["1"]).Count); 

Cette volonté génèrerait les éléments suivants:

2 
2 
True 
1 
1 

Attribution d'une nouvelle valeur à une clé dans l'un du dictionnaire n'a cependant aucun effet sur l'autre dictionnaire:

newDictionary["1"] = new List<int>{3,4}; 
Console.WriteLine(ReferenceEquals(orderedDictionary["1"], newDictionary["1"])); 
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count); 
Console.WriteLine(((List<int>)newDictionary["1"]).Count); 

Cette volonté sortie:

False 
2 
3 
+0

Juste ce que je pensais mais, serait-ce juste copier les références d'un dictionnaire à l'autre? Est-ce que ce serait "profond"? – Jodrell

+1

@Jodrell: Vous avez raison, ce n'est pas une copie profonde. Bien que le PO demande de faire une copie en profondeur, je ne pense pas qu'il veuille vraiment faire cela. J'ai lu sa question comme si, il voulait juste créer un nouveau 'OrderedDictionary' qui n'est pas en lecture seule. J'ai peut-être tort, cependant. –

+0

@Daniel Hilgarth: Votre solution est bonne, et elle fait une copie profonde de orderedDictionary, je l'ai testé, la modification des valeurs newDictionary n'affecte pas les valeurs orderedDicionary. Merci! –

Questions connexes