C# "System.InvalidOperationException: collection was modified enumeration operation may not execute." 에러 처리 방법

2024. 1. 23. 21:39· C#
목차
  1. | 에러 내용
  2. | 에러 해결 방법
  3. | 마무리
728x90
반응형

 


| 에러 내용

 

 

컬렉션을 사용하다 발생한 에러입니다.

이 에러는 프로그램이 컬렉션을 순회하고 있는 동안 컬렉션이 변경되었을 때 발생하는 에러입니다.

 

컬렉션을 순회하는 도중에는 원소를 추가하거나 제거하는 등의 작업을 수행하면 안 됩니다.

이러한 작업이 발생하면 컬렉션의 상태가 변경되고, 이는 열거 작업에 영향을 미칩니다. 

그렇기 때문에 .Net은 이런 상황을 예방하기 위해 이런 종류의 에러를 발생시킵니다.

 

예제) System.InvalidOperationException 에러 발생 상황

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
    if (number == 3)
    {
        numbers.Remove(number);
    }
}

 

위 코드는 1부터 5까지의 숫자를 담은 리스트에서 숫자 3을 찾아 제거하려고 하는 코드입니다.

하지만 foreach를 통해 리스트를 순회하는 도중에 리스트에서 원소를 제거하려 하므로 에러가 발생합니다. 


| 에러 해결 방법

이 문제를 해결하려면 원본 컬렉션을 바로 수정하는 것이 아니라,

복사본을 만들고 작업하면 해결할 수 있습니다.

 

예제) 컬렉션의 복사본을 만들어 컬렉션 수정 

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
List<int> numbersCopy = new List<int>(numbers);
foreach (int number in numbersCopy)
{
    if (number == 3)
    {
        numbers.Remove(number);
    }
}

 

원본 컬렉션인 'numbers'를 순회하는 것이 아니라 

복사본인 'numbersCopy'를 순회하므로, 원본 컬렉션을 수정하는 데 문제가 없습니다.

따라서 에러가 발생하지 않습니다.

 

예제) 크기가 큰 컬렉션의 순회

 

컬렉션의 크기가 너무 크다면, 컬렉션의 복사본을 만드는 것은 메모리 사용 측면에서 비효율적입니다. 

이런 경우, 리스트나 배열 대신 LinkedList 같은 다른 컬렉션 타입을 사용하거나,

원본 컬렉션을 복사하지 않는 방법으로 문제를 접근해야 합니다. 

 

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
for (int i = numbers.Count - 1; i >= 0; i--)
{
    if (numbers[i] == 3)
    {
        numbers.RemoveAt(i);
    }
}

 

예를 들어, for 루프와 RemoveAt 메서드를 사용해 뒤에서부터 컬렉션을 순회하며 원소를 제거하는 방법이 있습니다.

이렇게 하면 컬렉션을 순회하는 동안 발생하는 인덱스 변화를 피할 수 있습니다.

위 코드는 리스트의 끝에서부터 시작해서 앞으로 이동하며, 숫자 3을 찾으면 그 위치의 원소를 제거하는 코드입니다.

뒤에서부터 순회하기 때문에 원소를 제거하더라도 나머지 원소들의 인덱스에는 영향을 미치지 않습니다. 


| 마무리

프로젝트를 진행하며 리스트, 배열 등 컬렉션을 많이 사용하면서 

이번에 발생한 에러에 대해 정리하였습니다.

 

분명 알고 있던 내용이지만 막상 프로젝트를 시작하고 정신없이 코딩하다 보니 

신경을 쓰지 못했네요.. 

 

틀린 점이나 질문이 있으시면 댓글로 남겨주세요!

 

 

감사합니다 :)

 

 

728x90
반응형
저작자표시 (새창열림)

'C#' 카테고리의 다른 글

C# List의 마지막 요소에 접근하는 3가지 방법  (0) 2024.02.20
C# 멀티스레드 동기화 : Monitor.Enter, Monitor.Exit  (0) 2024.02.19
C# 이미지의 2차원 배열을 순회하는 여러가지 방법 - 2  (2) 2024.01.21
C# 이미지의 2차원 배열을 순회하는 여러가지 방법 - 1  (0) 2024.01.19
C# Partial Class 이해  (0) 2023.12.27
  1. | 에러 내용
  2. | 에러 해결 방법
  3. | 마무리
'C#' 카테고리의 다른 글
  • C# List의 마지막 요소에 접근하는 3가지 방법
  • C# 멀티스레드 동기화 : Monitor.Enter, Monitor.Exit
  • C# 이미지의 2차원 배열을 순회하는 여러가지 방법 - 2
  • C# 이미지의 2차원 배열을 순회하는 여러가지 방법 - 1
우준세
우준세
준세 단칸방우준세 님의 블로그입니다.
반응형
우준세
준세 단칸방
우준세
전체
오늘
어제
  • 분류 전체보기 (180)
    • Python (75)
      • Python 정리 (30)
      • 백준 알고리즘 (45)
    • C# (48)
      • Winform (12)
    • C & C++ (5)
      • C++ (1)
    • 영상처리 (17)
    • JAVA (11)
      • 코딩자율학습-스프링부트 (11)
    • AI (11)
      • DL (4)
      • Pytorch (5)
      • GAN (2)
    • Computer Science (3)
      • Algorithm (3)
    • Project (7)
    • 책 리뷰 (1)

블로그 메뉴

  • 글쓰기
  • 관리자

인기 글

태그

  • c# 비동기프로그래밍
  • 자바
  • c#
  • C# dataGridView
  • 알고리즘
  • 파이썬
  • opencv
  • C# 비동기 프로그래밍
  • C# Task 메서드
  • C# event
  • 백준
  • c# 정규표현식
  • pytorch tutorial
  • C# Monitor
  • 백준 파이썬
  • Winform DataGridView
  • opencv 객체 추적
  • Python
  • C# Evnet
  • 이벤트 기반 프로그래밍
  • pytorch tensor
  • 코딩자율학습
  • C# 비동기
  • python opencv
  • 스프링부트
  • C# deadlock
  • pytorch
  • C# 이벤트 프로그래밍
  • C# ContinueWith
  • c언어

최근 댓글

최근 글

우준세
C# "System.InvalidOperationException: collection was modified enumeration operation may not execute." 에러 처리 방법
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.