2012-10-20 14 views
1

안녕하세요, arrayList에서 2로 나눌 수있는 모든 숫자를 제거하려고합니다. 문제는 한 요소가 제거 된 후 InvalidOperationException이 발생한다는 것입니다.arrayList의 요소를 제거한 후 InvalidOperationException이 발생했습니다.

private ArrayList RemoveDivTwo(ArrayList list) { 
     int count = 0; 
     foreach(int i in list){ 
      if ((i > 2) && (i % 2 == 0)) { 
       list.RemoveAt(count); 
      } 
      count++; 
     } 

     return list; 
    } 

나는이 문제를 내가 예외 얻고 2로 나누어 모든 요소를 ​​제거 할 수 wont't를 해결할 수 있습니까?

+0

이것은 일반적인 것입니다. 'foreach'를 사용하여 반복하는 경우 컬렉션에 아이템을 추가/제거 할 수 없다는 것을 기억하십시오. –

+0

생각하시는 분은 왜이 부분이 잘못 되었습니까? 읽으십시오. http://stackoverflow.com/questions/1124221/modifying-collection-when-using-a-foreach-loop-in-c-sharp –

+0

ArrayList '는 기존 1.1 코드로 작업하지 않는 한 선호하는 콜렉션 유형이 아닙니다. ['List '] (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx)을 대신 사용하십시오. 'List '을 사용하면 코드를'list.RemoveAll (i => i> 2 && i % 2 == 0)'로 다시 쓸 수 있습니다. –

답변

2

이렇게 반복 해보십시오.

for(int i = 0; i < list.Count(); i++){ 
    if ((list[i] > 2) && (list[i] % 2 == 0)) { 
       list.RemoveAt(i); 
       i--; //as offsets have shifted by one due to removal 
      } 
} 

더 이상 목록을 반복하지 않습니다. 그래서 이것이 효과가있다.

+0

유일한 문제는 arrayList를 사용하고 있는데 얻을 수 없다는 것입니다. 요소는 인덱스를 던졌다 –

+0

예, 할 수 있습니다. 당신은 int로 다시 캐스팅해야합니다. 가능한 경우 List을 사용하는 또 다른 이유입니다. –

1

foreach 루프가 항목 목록을 반복하기 전에 collectionName.GetEnumerator 메서드를 호출하기 때문에 예외가 throw됩니다. 콜렉션에서 새로운 foreach 루프를 시작하지 않으면 GetEnumerator가 다시 호출되지 않습니다. 목록은 foreach 루프 내에서 수정할 수 없으며 목록의 읽기 전용 작업에만 사용됩니다.

반복에서 for 루프를 사용하고 목록에서 요소를 수정할 수도 있습니다.

1

필자는 요소 제거에 신경 쓰지 않을 것입니다. 새로운 목록으로 원하는 요소를 반환하십시오.

List<int> RemoveDivTwo(List<int> list) { 
    return list.Where(i => i % 2 == 1 || i <= 2).ToList(); 
} 
관련 문제