2010-12-08 7 views
3

Comment modifier une valeur dans le dictionnaire? Je veux réaffecter une valeur à une valeur dans mon dictionnaire en boucle sur mon dictionnaire comme celui-ci:comment modifier la valeur du dictionnaire pendant la boucle

for (int i = 0; i < dtParams.Count; i++) 
{ 
    dtParams.Values.ElementAt(i).Replace("'", "''"); 
} 

dtParams est mon Dictionary

Je veux faire quelque chose comme ceci:

string a = "car";  
a = a.Replace("r","t"); 
+0

double possible de [Comment itérer dictionnaire et modifier les valeurs?] (Http://stackoverflow.com/questions/2260446/how-to-iterate-through-dictionary-and-change-values) – SwDevMan81

+0

ils sont semblables mais pas les mêmes, et la solution dans Comment parcourir le dictionnaire et changer les valeurs? ne fonctionne pas avec moi –

Répondre

8

La chaîne Remplacer la fonction renvoie une nouvelle chaîne modifiée, de sorte que vous devez faire quelque chose comme:

foreach (var key in dtParams.Keys.ToArray()) 
{ 
    dtParams[key] = dtParams[key].Replace("'", "''"); 
} 

EDIT:

Adressé la collection est modifiée question (que je ne pensais pas que cela se produirait si vous accédez à une clé qui existe déjà ...)

+0

Exception :: La collection a été modifiée; l'opération d'énumération peut ne pas s'exécuter. –

+1

essayez d'utiliser une boucle for ou de créer un nouveau dictionnaire et d'y ajouter au lieu de supprimer. Vous ne pouvez pas modifier les membres de la collection dans une boucle foreach. – Pabuc

3

lorsque vous utilisez le remplacer, il retournera une nouvelle instance de chaîne, vous devez attribuer la valeur dans le dictionnaire après le remplacement car la chaîne est immuable dans la nature

+0

ouais je sais, je demande comment faire cela .. –

3

Vous ne pouvez pas le faire directement; vous ne pouvez pas modifier une collection pendant que vous l'énumérez (évitez également d'utiliser ElementAt ici, il s'agit d'une méthode d'extension LINQ to Objects et elle est inefficace pour parcourir une liste entière). Vous devrez faire une copie des clés et parcourir:

foreach(var key in dtParams.Keys.ToList()) // Calling ToList duplicates the list 
{ 
    dtParams[key] = dtParams[key].Replace("'", "''"); 
} 
+0

ne fonctionne pas aussi .. –

+0

@ user418343, ce qui ne fonctionne pas? –

+0

votre solution ... –

1

Un petit lambda ira loin. ;)

J'ai laissé tomber cela dans LINQPad et l'ai testé pour vous. Toutes les collections ont .To [xxx] méthodes donc vous pouvez le faire assez facilement en 1 ligne.

var dtParams = new Dictionary<string, string>(); 
dtParams.Add("1", "'"); 
dtParams.Add("a", "a"); 
dtParams.Add("b", "b"); 
dtParams.Add("2", "'"); 
dtParams.Add("c", "c"); 
dtParams.Add("d", "d"); 
dtParams.Add("e", "e"); 
dtParams.Add("3", "'"); 

var stuff = dtParams.ToDictionary(o => o.Key, o => o.Value.Replace("'", "''")); 
stuff.Dump(); 
Questions connexes