您不应该在迭代字典时更改字典,否则会出现异常。
因此,首先将键值对复制到临时列表,然后遍历该临时列表,然后更改字典:
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; }
然后使用aDictionary<string, Box<double>>
,然后可以在foreach中“修改”类似:kvp.Value.boxed = 123.456;
。并不是说这是“最佳”方法,但是它有其用途。