2010-04-28 4 views
5

오늘 두 개의 중첩 된 foreach 루프를 사용하는 함수를 코딩했습니다. 보고 나서 예상대로 작동하지 않는다고 디버깅했습니다. 그러나 나는 오류를 보지 않으며 단순한 오류가 내가 알아 차린 행동을 일으킬 수 있다고 생각하지 않습니다.foreach 이상한 동작 표시/아무 문제없이 작업

부분은 다음과 같습니다

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

말할 수 있습니다, checkedListBoxItemList.items 타입 MyClass에 4 개 항목을 보유하고 있으며 ActiveItemList 2 개 항목과 목록 < MyClass에>입니다.

디버거가 foreach 외부로 점프하고 내부 foreach에 도달하면 if를 두 번 (cActiveItem 당 한 번) 실행하고 외부 foreach의 끝 부분에 도달합니다. 이제 디버거가 외부 foreach의 헤드로 점프합니다. 할까요. 그러나 외부 foreach의 두 번째 라운드를 시작하는 대신 디버거가 갑자기 MyClass.ToString() 메서드로 점프합니다. 이 방법을 통해 4 번 (checkedListBoxItemList.Items의 항목 수)을 단계적으로 수행 할 수 있으며 ... 아무 것도 표시되지 않습니다. Visual Studio에서 내 창 형식을 표시하고 foreach가 계속되지 않습니다.

하는

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...*/; 
    } 
} 

모두에 코드를 변경할 때하는 것은 잘 작동하고 생각한다. 나는 그 문제를 동료에게 보여 줬지만, 그는 또한 무슨 일이 일어 났는지 이해하지 못했습니다. 나는 왜 디버거가 MyClass.ToString() 메소드로 점프하는지 이해하지 못한다. 단계별로 F10을 사용 했으므로 기능을 종료 할 필요가 없습니다. 그리고 심지어 이유가 있다면, 왜 foreach 루프가 계속되지 않습니까?

저는 Visual Studio 2010을 사용하고 있습니다.

무슨 일이 있었는지 말해주세요. 감사.

+1

'checkedListBoxItemList'의 유형은 무엇입니까? 'foreach'와 함께 사용하기 위해서는'IEnumerable'을 구현해야한다고 생각합니다. 그리고 어떤 타입인지 언급하지 않았습니다. –

+0

분명히 checkedListBoxItemList는 checkedListBox 유형입니다. 하지만 ListBox를 반복하지 않고 checkedListBoxItemList.Items를 통해 반복합니다. 이것은 CheckedItemCollection 유형이며 IEnumerable을 구현합니다. – Marks

답변

7

foreach를 사용하여 컬렉션을 반복 할 때 반복되는 컬렉션은 변경할 수 없습니다. 일치하는 항목에 대한 체크 박스를 체크하면 바깥 쪽 루프 (checkedListBoxItemList.Items)의 콜렉션이 변경되고 발생하는 오류가 어딘가에있을 것입니다. 왜 갑자기 ToString 메쏘드에 들어가서 루프를 계속하지 않는지에 대한 설명이 더 많거나 적습니다.

for 문을 사용하여 반복 할 때는 반복을 시작할 때 컬렉션에 대한 참조가 없으므로 이러한 제한이 없습니다.

희망 사항입니다.

+0

감사합니다. 반복 컬렉션을 변경할 수 없다는 것을 알고있었습니다. 그러나 .Items 내 MyClass 개체의 컬렉션 및 나던 확인 상태를 개최하지 않습니다, 나는 괜찮을 것이라고 생각했다. 컴파일러가 그 문제를 통지해서는 안된다? 과거에 반복 객체를 변경하지 말라고 컴파일러 오류를 기억합니다. 왜 디버거가 나를 ToString 메서드로 안내하는지에 대한 단서가 있습니까? 나는 F10을 사용했기 때문에 그 이유를 알지 못한다. – Marks