Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

IEnumerator-Schnittstelle

 

Veröffentlicht: Juli 2016

Unterstützt eine einfache Iteration durch eine nicht generische Auflistung.

Namespace:   System.Collections
Assembly:  mscorlib (in mscorlib.dll)

[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
[ComVisibleAttribute(true)]
public interface IEnumerator

NameBeschreibung
System_CAPS_pubpropertyCurrent

Ruft das Element in der Auflistung an der aktuellen Position des Enumerators ab.

NameBeschreibung
System_CAPS_pubmethodMoveNext()

Setzt den Enumerator auf das nächste Element der Auflistung.

System_CAPS_pubmethodReset()

Setzt den Enumerator auf seine anfängliche Position vor dem ersten Element in der Auflistung.

IEnumeratorist die Basisschnittstelle für alle nicht generischen Enumeratoren.

Die generische Version dieser Schnittstelle finden Sie unter IEnumerator<T>.

Die foreach-Anweisung der Programmiersprache C# (for each in Visual Basic) verbirgt die Komplexität der Enumeratoren.

Deshalb wird die Verwendung von foreach empfohlen anstatt den Enumerator direkt zu manipulieren.

Mit Enumeratoren können die Daten in der Auflistung zwar gelesen, jedoch nicht zum Ändern der zugrunde liegenden Auflistung verwendet werden.

Die Reset Methode wird für COM-Interoperabilität bereitgestellt und muss nicht vollständig implementiert werden; stattdessen kann der Implementierer eine NotSupportedException auslösen.

Zu Beginn wird der Enumerator vor das erste Element in der Auflistung positioniert. Rufen Sie die MoveNext Methode auf, um den Enumerator, vor dem Lesen des Werts von Current, auf das erste Element der Auflistung zu setzen. Andernfalls ist Current nicht definiert.

Current gibt solange dasselbe Objekt zurück, bis MoveNext oder Reset aufgerufen wird. MoveNext legt Current auf das nächste Element fest.

Wenn MoveNext das Ende der Auflistung überschreitet, wird der Enumerator hinter dem letzten Element in der Auflistung positioniert und MoveNext gibt false zurück.
Wenn der Enumerator an dieser Position ist, geben nachfolgende Aufrufe von MoveNext auch false zurück. Wenn der letzte Aufruf von MoveNext false zurückgegeben hat, löst das Aufrufen von Current eine Ausnahme aus.

Um Current erneut auf das erste Element der Auflistung festzulegen, rufen Sie Reset auf, sofern es implementiert ist, gefolgt von MoveNext. Wenn Reset nicht implementiert ist, müssen Sie zum Zurücksetzen auf das erste Element der Auflistung eine neue Enumeratorinstanz erstellen.

Ein Enumerator bleibt gültig, solange die Auflistung unverändert ist. Wenn Änderungen an der Auflistung gemacht wurden, z. B. das Hinzufügen, Ändern oder Löschen von Elementen, ist der Enumerator unwiederbringlich ungültig und der nächste Aufruf von MoveNext oder Reset löst eine InvalidOperationException aus. Wenn die Auflistung zwischen dem MoveNext- und dem Current-Aufruf geändert wird, gibt Current das Element auf das es festgelegt ist zurück, auch wenn der Enumerator bereits ungültig ist.

Der Enumerator hat keinen exklusiven Zugriff auf die Auflistung; daher ist die Enumeration einer Auflistung systembedingt kein threadsicheres Verfahren. Selbst wenn eine Auflistung synchronisiert wird, besteht die Möglichkeit, dass andere Threads sie ändern. Dies führt dazu, dass der Enumerator eine Ausnahme auslöst. Um während der Enumeration Threadsicherheit zu gewährleisten, können Sie entweder die Auflistung während der gesamten Enumeration sperren oder die Ausnahmen, die aus von anderen Threads stammenden Änderungen resultieren, abfangen.

Das folgende Codebeispiel veranschaulicht die Implementierung von der IEnumerable- und der IEnumerator-Schnittstelle für eine benutzerdefinierte Auflistung. In diesem Beispiel werden Member dieser Schnittstellen nicht explizit aufgerufen, aber sie sind implementiert, um die Verwendung von foreach (for each in Visual Basic) zum Durchlaufen der Auflistung zu unterstützen.

using System;
using System.Collections;

// Simple business object.
public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

// Collection of Person objects. This class
// implements IEnumerable so that it can be used
// with ForEach syntax.
public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

// Implementation for the GetEnumerator method.
    IEnumerator IEnumerable.GetEnumerator()
    {
       return (IEnumerator) GetEnumerator();
    }

    public PeopleEnum GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}

// When you implement IEnumerable, you must also implement IEnumerator.
public class PeopleEnum : IEnumerator
{
    public Person[] _people;

    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;

    public PeopleEnum(Person[] list)
    {
        _people = list;
    }

    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public Person Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}

class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);

    }
}

/* This code produces output similar to the following:
 *
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 */

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: