2011-11-16 2 views
3

IEnumerable(T) 및 사용자 지정 IEnumerator(T)을 구현하는 사용자 지정 컬렉션을 만들었습니다.C# 사용자 지정 반복자 구현 - foreach 루프 중 컬렉션 수정 금지

public void Add(T item) 
{ 
    T[] tempArray = new T[_array.Length + 1]; 

    for (int i = 0; i < _array.Length; i++) 
    { 
     tempArray[i] = _array[i]; 
    } 

    tempArray[_array.Length] = item; 

    _array = tempArray; 
    tempArray = null; 
} 

구현이 예 http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx에 기초한다 :

는 I는 다음과 같다 커스텀 컬렉션에 추가() 메소드를 첨가.

내 배열로 foreach 루프를 수행 할 때 루프 내에서 Add()를 호출하는 것과 같은 컬렉션 수정을 방지하고 새로운 InvalidOperationException을 throw하고 싶습니다. 내가 어떻게 할 수 있니?

답변

5

클래스 내에 버전 ID가 있어야합니다. 진입 점을 입력하면 Add이됩니다. (GetEnumerator() 호출에서) 반복자를 만들 때 버전 번호를 기억할 것입니다. 그리고 반복 할 때마다 버전 번호가 여전히 시작되었는지 여부를 확인하고 그렇지 않으면 던져 버릴 것입니다.

+0

감사합니다. 정말 간단한 해결책입니다. 이제 분명해 보입니다. =) – Spalatum

4

컬렉션을 수정할 때마다 증가시킬 수있는 필드를 컬렉션에 추가 할 수 있습니다. 열거자를 만들 때이 필드의 값을 열거 자에 저장합니다. 열거자를 사용할 때 필드의 현재 값이 열거자를 만들 때 저장된 값과 같은지 확인합니다. 그렇지 않다면 InvalidOperationException을 던지십시오.

1

코드에서 임시 배열 대신 목록을 사용하면 기본적으로 InvalidOperationException이 throw됩니다. 둘째로 IEnumerable의 제네릭 버전을 사용하여 얻을 수 있으며 사용자 지정 반복기를 만드는 노력을하지 않아도됩니다.