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.
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 đó. –
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