Vous ne devez pas modifier le dictionnaire pendant son itération, sinon vous obtenez une exception.
Il faut donc d'abord copier les paires clé-valeur dans une liste temporaire, puis itérer dans cette liste temporaire et enfin modifier votre dictionnaire :
Dictionary<string, double> myDict = new Dictionary<string, double>();
// a few values to play with
myDict["a"] = 2.200001;
myDict["b"] = 77777.3333;
myDict["c"] = 2.3459999999;
// prepare the temp list
List<KeyValuePair<string, double>> list = new List<KeyValuePair<string, double>>(myDict);
// iterate through the list and then change the dictionary object
foreach (KeyValuePair<string, double> kvp in list)
{
myDict[kvp.Key] = Math.Round(kvp.Value, 3);
}
// print the output
foreach (var pair in myDict)
{
Console.WriteLine(pair.Key + " = " + pair.Value);
}
// uncomment if needed
// Console.ReadLine();
(sur ma machine) :
a = 2.2
b = 77777.333
c = 2.346
Note En termes de performances, cette solution est un peu meilleure que les solutions actuellement affichées, puisque la valeur est déjà associée à la clé et qu'il n'est pas nécessaire de la récupérer à nouveau dans l'objet dictionnaire.
1 votes
Si l'ajout d'un grand nombre d'objets de référence est acceptable du point de vue des performances (indirection et plus de pression du gc) et vous avez le contrôle du dictionnaire, alors la création d'une boîte pour vos valeurs résoudrait le problème, par exemple
class Box<T> { public T boxed; }
et ensuite utiliser unDictionary<string, Box<double>>
que vous pouvez ensuite "modifier" dans le foreach, par exemple :kvp.Value.boxed = 123.456;
. Je ne dis pas que c'est la "meilleure" approche, mais elle a sa part d'utilité.0 votes
Cela répond-il à votre question ? Modification des valeurs d'un dictionnaire dans une boucle foreach