Lassen Sie uns diesen Code haben:
%Vor%Und in der Hauptmethode:
%Vor%Warum funktioniert die zweite förach nicht? und das "i" initialisiert nicht wieder ??
Stimmt das? Die Reset-Methode sollte automatisch aufgerufen werden, bevor foreach ausgeführt wird.
warum es hier nicht anruft ??
IEnumerable und IEnumerator sollten in der Regel separate Klassen sein. Mit Ausnahme von Enumeratoren, die immer leer oder immer das gleiche Element zurückgeben, muss die GetEnumerator-Methode immer eine neue Instanz eines IEnumerator zurückgeben.
Es gibt nicht viel Sinn für IEnumerator.Reset; for-each-Schleifen verwenden sie nicht, und Benutzer eines IEnumerable / IEnumerator können sie nur verwenden, wenn sie wissen, was der aufzählbare Typ ist. In diesem Fall könnten sie den tatsächlichen Typ anstelle der Schnittstelle verwenden.
Reset ist redundant; so sehr, dass es eine Anforderung in der Sprachspezifikation für Iteratorblöcke ist, eine Ausnahme auf Reset auszulösen. Das Richtige ist, einfach den alten Iterator zu entfernen und loszulassen und GetEnumerator erneut aufzurufen. Oder besser: vermeiden mit , um es zweimal zu lesen, da nicht alle Daten wiederholbar sind.
Reset wird nicht von foreach
aufgerufen. Ein Blick auf die Hauptmethode in Reflector bestätigt dies.
Die .NET-Klassen, wie ArrayList
, geben tatsächlich eine neue Instanz einer Klasse zurück, die IEnumerator implementiert.
Zum Beispiel ArrayList
implementiert IEnumerable
und seine GetEnumerator
Methode sieht folgendermaßen aus:
Sie müssen sich also keine Gedanken über den Aufruf von Reset machen, da jede foreach eine neue Instanz des Enumerators verwendet.
Ein vollständiges Beispiel mit der Implementierung von IEnumerable und einer separaten Klasse, die IEnumerator implementiert, finden Sie in der Dokumentation zu IEnumerable .
Dort gibt es viele Instanzen, in denen ich das tun muss, also rufe ich in meiner GetEnumerator-Methode reset auf. Hier ist ein Beispiel:
%Vor%