2015-12-03 16 views
7

Lưu ý: Điều này đã hoạt động tốt, nhưng tôi đang cố gắng để hiểu Tại sao nó hoạt động theo cách này, nhưng không phải là khác.Sự nhầm lẫn mã - tại sao một người làm việc, nhưng không phải là người khác?

Tôi có một WinForm (C#) với động đưa hình ảnh, như vậy: enter image description here

Bây giờ nếu bạn nhấp vào nút 'Napred', những hình ảnh này sẽ bị xóa (trong số những thứ khác), mà tôi ban đầu sử dụng:

foreach(Control ctrl in Controls) 
    if(ctrl is PictureBox) ctrl.Dispose(); 

hoặc

for(int i = 0; i < Controls.Count; i++) 
    if(Controls[i] is PictureBox) Controls[i].Dispose(); 

Bây giờ nếu tôi chạy này, tôi nhận được:

enter image description here

Nhưng nếu tôi chỉ cần thay đổi tuyên bố for để gửi nó về phía sau, nó làm việc?

for(int i = Controls.Count - 1; i >= 0; i--) 
    if(Controls[i] is PictureBox) Controls[i].Dispose(); 

(Tôi sẽ không để tải lên hình ảnh khác, nhưng nó sẽ xoá tất cả các yếu tố (Tôi chỉ nhận được các nút còn lại trong cuối))

Ai đó có thể soi sáng cho tôi lý do tại sao một việc , nhưng không phải là khác?

EDIT: Tôi đang sử dụng phiên bản cộng đồng VS2015 trên Windows 10 nếu đó là một lỗi gỡ lỗi

+0

Nếu bạn có một mảng của 10 mặt hàng và sau đó xóa Item1, Item2 sẽ trở nên mới Item1 và bạn sẽ có 9 mục còn lại. Phương pháp tiêu chuẩn để xử lý các mục mảng là bước qua nó. – LightBulb

+0

Có thể quan tâm đến các cách tiếp cận khác: http://stackoverflow.com/questions/7340757/c-sharp-list-removing-items-while-looping-iterating –

+0

Tại sao bạn không sử dụng phương pháp Xóa? –

Trả lời

12

Bạn đang cố gắng để thay đổi danh sách các bạn đang lặp lại kết thúc, trong đó tất nhiên sẽ thay đổi (?) các chỉ mục của danh sách này nên chỉ số tại chỉ số 1 hiện đang ở chỉ số 0.

Bằng cách loại bỏ từ cuối mảng (ngược lại), các chỉ mục trước sẽ luôn giống nhau.

của nó cũng quan trọng cần lưu ý như đã nêu trong bình luận của Matthew Watson:

Control.Dispose() là đặc biệt và sẽ loại bỏ sự kiểm soát từ danh sách Controls một container của cha mẹ.

Đây không phải là mặc định behavour bởi hầu hết các phương pháp Vứt bỏ, bởi vậy bạn sẽ không phải lúc nào thấy hành vi này khi sử dụng Dispose

+1

Tôi hiểu, đó là lý do tại sao mọi phần tử thứ 2 đều bị xóa. Cảm ơn cho thanh toán bù trừ này lên! Nó đã không vượt qua tâm trí của tôi cả! – NemanjaT

+2

Tôi nghĩ bạn nên rõ ràng về cách anh ấy thay đổi danh sách mà anh ta đang lặp lại, bởi vì chỉ từ việc kiểm tra mã, anh ấy không xóa các mục khỏi danh sách trực tiếp. Câu trả lời là 'Control.Dispose()' là đặc biệt và sẽ loại bỏ điều khiển từ danh sách 'Controls' của vùng chứa cha mẹ. –

+0

@MatthewWatson - Rất đúng, tôi đã cố gắng để giữ cho chung này tham chiếu đến danh sách mình – Sayse

Các vấn đề liên quan