List<T> someList = new List<T>(new T[4]);
foreach(var data in someList){
    if(data == null){
        someList.Remove(data);
    }
}

위와 같이 작성을 하게 되면, List의 Remove메서드의 특징으로 인해서

InvalidOperationException: Collection was modified; enumeration operation may not execute.

위와 같은 에러를 만나게된다.

foreach(var data in someList){
    if(data == null){
        someList.Remove(data);
        break;
    }
}

단순히 한 가지 아이템을 찾기 위한 것이라면, 위와 같이 break를 활용하여, 간단히 에러 없이 넘어갈 수 있겠지만,

위에서 작성한 코드처럼 List에 존재하는 목록을 모두 확인해야하는 경우가 있을 수 있다.

이런 경우라면 foreach는 사용하는 것이 어렵다.

그래서, for문을 활용하여 작성을 하는 것이 좋다.

여기서, 반복문 작성 시의 유의점이 있다. List의 Remove나 RemoveAt 메서드는 해당 item을 지우고 난 뒤에 자동으로

List의 크기를 줄여주기 때문에 주의해야하는 점이 있는데,

for(int index = 0; i < someList.Count; index++){
    if(someList[i] == null){
        someList.RemoveAt(index);
    }
}

일반적으로 위와 같이 for문을 작성하게되는데, 위와 같이 작성을 하게되면, RemoveAt을 통해서 줄어버린 List의 index에 접근을

못하고 넘어가버리는 경우가 발생하기때문에 List의 모든 항목을 점검하지 못하게되는 문제가 생긴다.

for(int index = someList.Count - 1; index >= 0; index--){
    if(someList[i] == null){
        someList.RemoveAt(index);
    }
}

따라서, 위와 같이 작성하는 것이 안전하게 List의 모든 목록을 확인할 수 있는 형태이다.

+ Recent posts