none
Foreach loop안에서 generic list에 있는 아이템을 지울수 있나요?? RRS feed

  • 질문

  • Foreach loop안에서 generic list에 있는 아이템을 지울수 있나요??

    시도를 하면 "Collection was modified; enumeration operation may not execute" 에러를 발생시킵니다.

    2012년 6월 27일 수요일 오전 12:19

답변

  • "Jina Lee" 님의 답변에 첨언하자면.

    Foreach 에서 사용되는 IEnumerator 인스턴스는 기본적으로 '읽기 전용' 입니다. 그 때문에, foreach 동안에 해당 컬렉션의 항목을 추가/삭제 할 수 없어서 말씀하신 그와 같은 오류가 발생하는 것입니다.

    자세한 사항을 다음에 설명했으니 참고하세요. ^^

    IEnumerator는 언제나 읽기 전용일까?
    ; http://www.sysnet.pe.kr/2/0/1308


    2012년 6월 27일 수요일 오전 1:25

모든 응답

  • 안녕하십니까? 별대리 님,
    Microsoft MSDN 의 Forum 사이트를 방문해 주셔서 감사합니다.

    현재 문의 하신 ”Foreach loop안에서 generic list에 있는 아이템을 지울수 있나요??" 대해 답변드리겠습니다.


    아래 참조 부탁드립니다.
    [Wrong version codes]
     
                System.Collections.Generic.List<object> list = new List<object>();
     
                for (int i = 0; i <= 19;i++ )
     
                {
     
                    list.Add(i / 10);
     
                }
     
     
     
                foreach (object o in list)
     
                {
     
                    if (System.Convert.ToInt32(o) == 1)
     
                    {
     
                        list.Remove(o);
     
                    }
     
                }
     
    [Right version codes]
     
                System.Collections.Generic.List<object> list = new List<object>();
     
                for (int i = 0; i <= 19;i++ )
     
                {
     
                    list.Add(i / 10);
     
                }
     
     
     
                ArrayList arraylist = new ArrayList();
     
     
     
                foreach (object o in list)
     
                {
     
                    if (System.Convert.ToInt32(o) == 1)
     
                    {
     
                        arraylist.Add(o);
     
                    }
     
                }
     
     
     
                foreach (object o in arraylist)
     
                {
     
                    list.Remove(o);
     
                }

    [참고자료]
    How to remove an item in a Generic List inside a foreach loop
    Collection was modified; enumeration operation may not execute." error

    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.

    2012년 6월 27일 수요일 오전 12:29
    중재자
  • "Jina Lee" 님의 답변에 첨언하자면.

    Foreach 에서 사용되는 IEnumerator 인스턴스는 기본적으로 '읽기 전용' 입니다. 그 때문에, foreach 동안에 해당 컬렉션의 항목을 추가/삭제 할 수 없어서 말씀하신 그와 같은 오류가 발생하는 것입니다.

    자세한 사항을 다음에 설명했으니 참고하세요. ^^

    IEnumerator는 언제나 읽기 전용일까?
    ; http://www.sysnet.pe.kr/2/0/1308


    2012년 6월 27일 수요일 오전 1:25
  • Collection이 수정되었다는 오류메세지는

    대부분이 실제로 for문이 돌고있는 도중에 실제로 Collection이 수정되어서 그런것입니다.

    for문이 0~10까지 돌고 있는데 Index가 두번째인것이 Remove되어 중간에것이 지워지면서 지워진 것을 제외하고 하나씩 Collection의 index가 당겨져서 발생하는 오류입니다.

    Remove시에는 for문을 Collection의 끝에서 부터 역순으로 돌면서 Remove하시면 Collection의 Index가 변경되지 않고 처리될것 같습니다.

    도움 되셨기를... 

    • 답변으로 제안됨 몽토끼 2012년 7월 13일 금요일 오전 2:45
    2012년 7월 12일 목요일 오전 6:50