2010-04-28 24 views
5

Hôm nay tôi đã mã hóa một hàm sử dụng hai vòng lặp forested lồng nhau. Sau khi nhìn thấy, nó không hoạt động như mong đợi, tôi đã sửa nó. Nhưng tôi không thấy một lỗi, và không nghĩ rằng một lỗi đơn giản có thể gây ra các hành vi tôi đã nhận thấy.C# - foreach hiển thị hành vi kỳ lạ/khi làm việc không có vấn đề

Phần trông như thế này:

foreach(MyClass cItem in checkedListBoxItemList.Items) 
{ 
    foreach(MyClass cActiveItem in ActiveItemList) 
    { 
     if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/; 
    } 
} 

phép nói rằng, checkedListBoxItemList.items giữ 4 mục kiểu MyClass, và ActiveItemList là một danh sách < MyClass> với 2 Items.

Trình gỡ lỗi nhảy vào bên ngoài foreach, đến bên trong foreach, thực hiện nếu 2 lần (một lần cho mỗi cActiveItem) và đạt đến cuối của foreach.Now, trình gỡ lỗi nhảy trở lại đầu của foreach bên ngoài vì nó Nên. Nhưng thay vì bắt đầu vòng thứ hai của foreach bên ngoài, trình gỡ rối đột nhiên nhảy vào phương thức MyClass.ToString(). Tôi có thể bước qua phương pháp này 4 lần (số mục trong checkedListBoxItemList.Items) và sau đó ... không có gì. Visual Studio cho tôi thấy hình thức cửa sổ của tôi, và foreach không được tiếp tục.

Khi thay đổi mã để

int ListCount = checkedListBoxItemList.Items.Count; 
for(int i=0; i<ListCount; i++) 
{ 
    MyClass cItem = checkedListBoxItemList.Items[i] as MyClass; 
    foreach(MyClass cActiveItem in ActiveItemList) 
    { 
     if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/; 
    } 
} 

tất cả mọi thứ hoạt động tốt và như vụ. Tôi cho thấy vấn đề với một đồng nghiệp, nhưng anh cũng không hiểu, chuyện gì đã xảy ra. Tôi không hiểu tại sao trình gỡ lỗi nhảy vào phương thức MyClass.ToString(). Tôi đã sử dụng F10 để bước qua, vì vậy không cần phải rời khỏi chức năng. Và thậm chí, nếu có lý do, tại sao vòng lặp foreach vẫn tiếp tục?

Im sử dụng Visual Studio 2010, nếu đây là vấn đề.

Hãy cho tôi biết điều gì đã xảy ra. Cảm ơn.

+1

Loại 'checkedListBoxItemList' là gì? Tôi tin rằng nó phải thực hiện 'IEnumerable' để được sử dụng với 'foreach', và tôi không thấy nơi bạn đã đề cập đến loại đó. –

+0

Rõ ràng checkedListBoxItemList là loại checkedListBox. Nhưng im không lặp qua ListBox, nhưng trên checkedListBoxItemList.Items. Đây là loại CheckedItemCollection và triển khai IEnumerable. – Marks

Trả lời

7

Khi lặp lại một bộ sưu tập (sử dụng foreach), bộ sưu tập bạn đang lặp lại không được phép thay đổi; nhưng khi bạn kiểm tra hộp kiểm cho mục phù hợp, bộ sưu tập của vòng lặp bên ngoài (checkedListBoxItemList.Items) thay đổi và lỗi hậu quả được ném có thể được nuốt ở đâu đó. Điều đó càng ít giải thích tại sao bạn đột nhiên đi vào phương pháp ToString và không tiếp tục vòng lặp.

Khi bạn sử dụng câu lệnh for để lặp lại, bạn không có giới hạn đó vì không có tham chiếu đến bộ sưu tập tại thời điểm bạn bắt đầu lặp lại.

Hy vọng điều này sẽ giải thích.

+0

Cảm ơn. Tôi biết rằng tôi không thể thay đổi bộ sưu tập lặp lại. Nhưng kể từ .Items là một tập hợp các đối tượng MyClass của tôi, và không giữ trạng thái được kiểm tra, tôi nghĩ rằng nó sẽ là ok. Không nên trình biên dịch thông báo vấn đề đó? Tôi nhớ lỗi trình biên dịch nói với tôi không thay đổi đối tượng lặp trong quá khứ. Bất kỳ đầu mối nào về lý do tại sao trình gỡ lỗi đang dẫn tôi đến phương thức ToString? Tôi không thấy một lý do cho nó kể từ khi tôi sử dụng F10 (Bước qua). – Marks

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