방법: 사용자 정의 컬렉션 마다 반복
전용이 아닌 GetEnumerator 함수는 핸들을 반환 하는 열거자 클래스 또는 인터페이스에 필요한 클래스 관리 컬렉션 이어야 합니다.열거자 클래스는 비정적 MoveNext 함수 및 현재 속성에 대 한 선언을 포함 해야 합니다.
예제
간단한 사용자 참조 형식의 컬렉션을 정의합니다.
// for_each_user_defined_collections.cpp
// compile with: /clr
using namespace System;
public interface struct IMyEnumerator {
bool MoveNext();
property Object^ Current {
Object^ get();
}
void Reset();
};
public ref struct MyArray {
MyArray( array<int>^ d ) {
data = d;
}
ref struct enumerator : IMyEnumerator {
enumerator( MyArray^ myArr ) {
colInst = myArr;
currentIndex = -1;
}
virtual bool MoveNext() {
if( currentIndex < colInst->data->Length - 1 ) {
currentIndex++;
return true;
}
return false;
}
property Object^ Current {
virtual Object^ get() {
return colInst->data[currentIndex];
}
};
virtual void Reset() {}
~enumerator() {}
MyArray^ colInst;
int currentIndex;
};
array<int>^ data;
IMyEnumerator^ GetEnumerator() {
return gcnew enumerator(this);
}
};
int main() {
int retval = 0;
MyArray^ col = gcnew MyArray( gcnew array<int>{10, 20, 30 } );
for each ( Object^ c in col )
retval += (int)c;
retval -= 10 + 20 + 30;
for each ( int c in gcnew MyArray( gcnew array<int>{10, 20, 30 } ) )
retval += c;
retval -= 10 + 20 + 30;
Console::WriteLine("Return Code: {0}", retval );
return retval;
}