No debe cambiar el diccionario mientras lo itera, de lo contrario obtendrá una excepción.
Así que primero copiar los pares clave-valor a una lista temporal y luego iterar a través de esta lista temperatura y luego cambiar su diccionario:
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();
salida (en mi máquina):
a = 2.2
b = 77777.333
c = 2.346
Nota: en términos de rendimiento, esta solución es un poco mejor que las soluciones publicadas actualmente, ya que el valor ya está asignado con la clave, y no hay necesidad de volver a buscarlo desde el objeto del diccionario.
Si la adición de una gran cantidad de objetos de referencia es aceptable desde una perspectiva de rendimiento (direccionamiento indirecto y más presión de gc) _y_ usted tiene control sobre el diccionario y luego crear un cuadro para sus valores resolvería el problema, por ejemplo: 'class Box {public T en caja; } 'y luego use' Dictionary > 'que luego puede" modificar "en el foreach algo así como:' kvp.Value.boxed = 123.456; '. No dice que es el "mejor" enfoque, pero tiene su parte de usos. –
AnorZaken