[vc_row][vc_column][vc_column_text]

Die Enumeratoren in C#

[/vc_column_text][vc_column_text css=“.vc_custom_1567662472982{border-top-width: 1px !important;border-right-width: 1px !important;border-bottom-width: 1px !important;border-left-width: 1px !important;padding-top: 20px !important;padding-right: 20px !important;padding-bottom: 20px !important;padding-left: 20px !important;border-left-color: #efefef !important;border-left-style: solid !important;border-right-color: #efefef !important;border-right-style: solid !important;border-top-color: #efefef !important;border-top-style: solid !important;border-bottom-color: #efefef !important;border-bottom-style: solid !important;}“]Neulich in der Entwicklungsabteilung der econ-tec GmbH:

“Schon mal wer mit ‘nem Enumerator gearbeitet? Ich meine jetzt nicht Klassen vom Typ »Enum«. Ich meine die Dinger, mit denen man Foreach durchschleifen kann.”[/vc_column_text][vc_column_text]Ich hatte heute die Verlegenheit, dass ich zum einen durch eine solche Collection schleifen musste, zum anderen aber einen Schleifenzähler benötigt hätte. Natürlich ist Foreach bequem, da automatisch das aktuelle Objekt aus der Collection beschafft wird, aber es fehlt eben der Zähler. Nun könnte natürlich ein zusätzlicher Zähler implementiert werden, aber wozu, wenn es doch die Möglichkeit einer For Schleife in Verbindung mit einem Enumerator gibt? Voraussetzung ist, dass im Typ, durch den iteriert werden soll, das Interface IEnumerable implementiert wurde bzw. dass der Typ die Vorgaben des Interfaces erfüllt. So wie z. B. der Datentyp List, durch den ich schleifen wollte.[/vc_column_text][vc_column_text]

List listOfStrings = new List();
// do something
List.Enumerator enumerator = listOfStrings.GetEnumerator();
for (int i = 0; enumerator.MoveNext(); i++)
{
    string element = enumerator.Current;
    // do something
}

[/vc_column_text][vc_column_text]Folgendes gilt es zu beachten: vor der Schleife mit GetEnumerator den sogenannten Enumerator besorgen. Es handelt sich um den Rückgabetyp der Methode. Der Typ List bringt mit der eingebetteten Struktur Enumerator praktischerweise gleich den passenden Typ mit, um das Ergebnis von GetEnumerator in Empfang zu nehmen. Dieser Typ wiederum sollte das Interface IEnumerator implementieren oder eben dessen Anforderungen erfüllen. Dadurch wird erzwungen, dass es eine Methode MoveNext und eine Property Current gibt. MoveNext ist für die Positionierung des Enumerators innerhalb der Collection zuständig. Sobald das Ende der Collection erreicht ist, liefert MoveNext den Wert false. Dadurch kann die Methode wunderbar als Abbruchbedingung einer Schleife verwendet werden. Da vor dem ersten Zugriff der Enumerator VOR dem ersten Element positioniert ist, muss einmal MoveNext ausgeführt werden. Im Beispiel handelt es sich um eine kopfgesteuerte Schleife, somit ist dies bereits gewährleistet. Nach MoveNext steht dann in Current das aktuelle Objekt der Collection. Wenn vor dem ersten Zugriff MoveNext nicht ausgeführt wurde, ist Current gleich null.[/vc_column_text][vc_column_text]Foreach macht übrigens nichts anderes im Hintergrund als auf Enumeratoren zuzugreifen. Um genau zu sein kann aus diesem Grund Foreach überhaupt nur bei Typen verwendet werden, welche eine Methode GetEnumerator mit einem wie oben beschriebenen Rückgabetyp implementieren.[/vc_column_text][vc_column_text]Sofern am Ende der Schleife nochmal von vorne begonnen werden soll, muss der Enumerator erst neu positioniert werden. Dies erfolgt ganz simpel durch das Zurücksetzen der Position mittels der Reset Methode. Ebenfalls vom Interface IEnumerator.[/vc_column_text][vc_column_text]

Für weitere Infos:
https://docs.microsoft.com/en-us/dotnet/api/system.collections.ienumerable.getenumerator?view=netframework-4.7.2

[/vc_column_text][/vc_column][/vc_row]