Gewusst wie: Durchlaufen Sie mit einer benutzerdefinierten Auflistung von jedem für
Damit eine Klasse ist eine verwaltete Auflistung, erfordert sie eine Funktion NichtPRIVATEs GetEnumerator, die einem Handle einer Enumeratorklasse oder Schnittstelle zurückgibt. Die Enumeratorklasse muss die Deklaration für nicht statische MoveNext-Funktion und Stromeigenschaft enthalten.
Beispiel
Einfache benutzerdefinierte Auflistung mit Referenztypen.
// 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;
}