Bạn không nên thay đổi từ điển trong khi lặp lại nó, nếu không bạn sẽ nhận được một ngoại lệ.
Vì vậy, đầu tiên sao chép các cặp khóa-giá trị vào danh sách tạm thời và sau đó lặp qua danh sách tạm thời này và sau đó thay đổi từ điển của bạn:
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();
đầu ra (trên máy tính của tôi):
a = 2.2
b = 77777.333
c = 2.346
Lưu ý: về mặt hiệu suất, giải pháp này tốt hơn một chút so với các giải pháp được đăng hiện tại vì giá trị đã được gán với khóa và không cần tìm nạp lại từ đối tượng từ điển.
Nguồn
2010-02-14 07:46:58
Nếu thêm rất nhiều đối tượng tham khảo được chấp nhận từ góc nhìn hiệu suất (indirection và gc-pressure) _and_ bạn có quyền kiểm soát từ điển sau đó tạo một hộp cho giá trị của bạn sẽ giải quyết được vấn đề, ví dụ: 'class Box {công khai T đóng hộp; } 'và sau đó sử dụng một chuỗi' Dictionary <, Box > 'mà sau đó bạn có thể" sửa đổi "trong một thứ gì đó như:' kvp.Value.boxed = 123.456; '. Không nói đó là cách tiếp cận "tốt nhất" nhưng nó có phần sử dụng của nó. –
AnorZaken