Не слід змінювати словник під час ітерації, інакше ви отримаєте виняток.
Отже, спочатку скопіюйте пари ключ-значення в тимчасовий список, а потім перегляньте цей тимчасовий список, а потім змініть свій словник:
Dictionary<string, double> myDict = new Dictionary<string, double>();
myDict["a"] = 2.200001;
myDict["b"] = 77777.3333;
myDict["c"] = 2.3459999999;
List<KeyValuePair<string, double>> list = new List<KeyValuePair<string, double>>(myDict);
foreach (KeyValuePair<string, double> kvp in list)
{
myDict[kvp.Key] = Math.Round(kvp.Value, 3);
}
foreach (var pair in myDict)
{
Console.WriteLine(pair.Key + " = " + pair.Value);
}
вихід (на моїй машині):
a = 2,2
b = 77777,333
c = 2,346
Примітка : з точки зору продуктивності, це рішення трохи краще, ніж опубліковані на даний момент рішення, оскільки значення вже присвоєне ключем, і немає необхідності знову отримувати його з об’єкта словника.
class Box<T> { public T boxed; }
а потім скористайтесяDictionary<string, Box<double>>
яким «змінити» в Еогеасп що - щось на кшталт:kvp.Value.boxed = 123.456;
. Не кажучи, що це "найкращий" підхід, але він має свою частку використання.