본문 바로가기

C#

[ C# ] foreach 문을 돌리며 리스트 안에 객체를 삭제시 주의점

[ 주의점 ]

[ 문제 상황 ]

 //곡의 점수는 있지만 MusicDataDic에는 없는 경우(해당 곡이 빠진 경우)를 확인
        foreach (var musicData in totalScoreData.totalScoreDic.Keys)
        {
            if (SoundManager.instance.MusicDataDic.ContainsKey(musicData) == false)
            {
                Debug.Log("키는" + musicData);
                //해당 데이터를 지워준다.
                totalScoreData.totalScoreDic.Remove(musicData);
               
            }
        }

=>문제의 메서드는 다음과 같다 . 아래와 같은 오류를 보여주었다 .

[ 해결 ]

=>이는 foeach 문을 돌리는 중 리스트 내부의 요소를 삭제하였기때문에 생긴 문제이다 .

foreach 문을 쓰는 대신 for문을 + 뒤 요소부터 검사하여 문제를 해결하였다

 //곡의 점수는 있지만 MusicDataDic에는 없는 경우(해당 곡이 빠진 경우)를 확인
        List<string> list = totalScoreData.totalScoreDic.Keys.ToList();
        for (int i=list.Count-1;i >=0;i--)
        {
            if (SoundManager.instance.MusicDataDic.ContainsKey(list[i]) == false)
            {
                Debug.Log("키는" + list[i]);
                //해당 데이터를 지워준다.
                totalScoreData.totalScoreDic.Remove(list[i]);

            }
        }

출처

https://ruen346.tistory.com/109?category=814615