이 글에서는 C#에서 발생하는 InvalidOperationException 에러를 자세히 다루고, 해결 방법을 제시합니다.
문제상황:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
if (number % 2 == 0)
{
numbers.Remove(number);
}
}
}
}
위 코드는 짝수를 찾아 리스트에서 제거하는 코드입니다. 하지만 이 코드를 실행하면 InvalidOperationException이 발생합니다.
에러로그 내용:
Unhandled Exception: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
원인분석:
이 에러가 발생하는 원인은 foreach 루프 내에서 컬렉션을 수정하려고 시도했기 때문입니다. 이해를 돕기 위해 몇 가지 개념을 살펴봅시다.
- foreach 루프: C#에서 컬렉션의 각 요소에 대해 반복 작업을 수행할 때 사용하는 반복문입니다.
- 컬렉션: 리스트, 배열, 딕셔너리 등의 데이터 구조를 일반화한 개념입니다.
에러 발생 원리는 다음과 같습니다.
- foreach 루프가 실행됩니다.
- 리스트의 각 요소를 순회하면서 짝수를 찾습니다.
- 짝수를 발견하면 해당 요소를 리스트에서 제거합니다.
- 컬렉션을 수정하게 되면서 foreach 루프가 더 이상 안전하게 실행될 수 없으므로 InvalidOperationException이 발생합니다.
해결방법-1 (새로운 컬렉션 사용):
에러가 수정된 코드:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
List<int> removedNumbers = new List<int>();
foreach (int number in numbers)
{
if (number % 2 == 0)
{
removedNumbers.Add(number);
}
}
foreach (int number in removedNumbers)
{
numbers.Remove(number);
}
}
}
해결된 코드의 작동 원리
- 새로운 리스트 removedNumbers를 만듭니다.
- foreach 루프를 사용하여 짝수를 찾고 removedNumbers에 추가합니다.
- 또 다른 foreach 루프를 사용하여 removedNumbers의 모든 요소를 numbers에서 제거합니다.
해결방법-2 (RemoveAll 메서드 사용):
에러가 수정된 코드:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4,5 };
numbers.RemoveAll(number => number % 2 == 0);
}
}
(해결된 코드의 작동 원리)
- List 클래스의 RemoveAll 메서드를 사용하여 짝수를 조건으로 만족하는 모든 요소를 한 번에 제거합니다.
- 이렇게 하면 foreach 루프를 사용하지 않고도 원하는 작업을 수행할 수 있습니다.
해결방법-3 (for 루프 사용):
에러가 수정된 코드:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
for (int i = numbers.Count - 1; i >= 0; i--)
{
if (numbers[i] % 2 == 0)
{
numbers.RemoveAt(i);
}
}
}
}
해결된 코드의 작동 원리
- 역순으로 for 루프를 사용하여 리스트를 순회합니다.
- 짝수를 찾으면 해당 요소를 제거합니다.
- 이렇게 하면 컬렉션을 수정해도 에러가 발생하지 않습니다.
참고링크:
728x90