Porady: iterowanie przez kolekcję zdefiniowaną przez użytkownika za pomocą instrukcji for each
Aby klasa mogła być kolekcją zarządzanych potrzebuje funkcja GetEnumerator-prywatny, która zwraca dojścia do klasy modułu wyliczającego lub interfejs. Klasy modułu wyliczającego musi zawierać deklaracji przez funkcję MoveNext-statycznej i właściwości bieżącego.
Przykład
Zdefiniowany przez użytkownika proste kolekcji z typami odwołań.
// 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;
}