Nếu bạn đang sử dụng một từ điển thay vì một Hashtable, do đó loại các phím được biết, cách dễ nhất để tạo một bản sao của bộ sưu tập Keys để tránh ngoại lệ này là:
foreach (string key in new List<string>(dictionary.Keys))
Tại sao bạn nhận được một ngoại lệ cho bạn biết rằng bạn đã sửa đổi bộ sưu tập mà bạn đang lặp lại, khi thực tế bạn chưa có?
Trong nội bộ, lớp Hashtable có trường phiên bản. Các phương thức Add, Insert và Remove tăng phiên bản này. Khi bạn tạo một điều tra viên trên bất kỳ bộ sưu tập nào mà Hashtable hiển thị, đối tượng liệt kê bao gồm phiên bản hiện tại của Hashtable. Phương thức MoveNext của liệt kê kiểm tra phiên bản của người đếm ngược với Hashtable, và nếu chúng không bằng nhau, nó sẽ ném ra InvalidOperationException mà bạn đang thấy.
Đây là một cơ chế rất đơn giản để xác định có hay không Hashtable đã được sửa đổi. Trong thực tế nó là một chút quá đơn giản. Bộ sưu tập Keys thực sự phải duy trì phiên bản riêng của nó, và phương pháp GetEnumerator của nó nên lưu phiên bản của bộ sưu tập trong điều tra viên, chứ không phải phiên bản của Hashtable.
Có một lỗi thiết kế phụ khác trong phương pháp này. Phiên bản là Int32. Phương thức UpdateVersion không kiểm tra giới hạn. Do đó có thể, nếu bạn thực hiện đúng số sửa đổi cho Hashtable (2 lần Int32.MaxValue
, cho hay lấy), đối với phiên bản trên Hashtable và điều tra là giống nhau mặc dù bạn đã thay đổi triệt để Hashtable từ khi tạo điều tra viên. Vì vậy, các phương pháp MoveNext sẽ không ném ngoại lệ mặc dù nó cần, và bạn sẽ nhận được kết quả bất ngờ.
Nguồn
2008-11-29 04:23:50
Tin rằng đây là một câu hỏi dup xem: http://stackoverflow.com/questions/287195/how-to-add-items-to-a-collection -nút-tiêu thụ-nó –