foreach
-
[C#/Unity] List와 반복문 사용시의 주의점2021.01.23
[C#/Unity] List와 반복문 사용시의 주의점
2021. 1. 23. 03:24
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의 모든 목록을 확인할 수 있는 형태이다.
'IT > Unity' 카테고리의 다른 글
[Unity] 스크립트 실행 순서 설정하기(Script Exception Order) (0) | 2021.07.07 |
---|---|
[Unity] 플랫폼 별 변경되는 경로에 따른 코드 작성 (0) | 2020.12.27 |
[Unity] 유니티의 렌더링 순서 (0) | 2020.12.01 |