wake-up-neo.com

Was ist der Unterschied zwischen IEnumerator und IEnumerable?

Mögliches Duplikat:
Kann mir jemand IEnumerable und IEnumerator erklären?

Was sind die Unterschiede zwischen IEnumerator und IEnumerable?

95
Shaun

IEnumerable ist eine Schnittstelle, die eine Methode definiert GetEnumerator , die ein IEnumerator Schnittstelle, über die wiederum schreibgeschützt auf eine Sammlung zugegriffen werden kann. Eine Auflistung, die IEnumerable implementiert, kann mit einer foreach-Anweisung verwendet werden.

Definition

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();

Beispielcode von codebetter.com

107
cgreeno

Ein IEnumerator ist eine Sache, die aufgezählt werden kann: Es hat die Eigenschaft Current und die Methoden MoveNext und Reset (die Sie in .NET-Code wahrscheinlich gewonnen haben). ' nicht explizit anrufen, obwohl Sie könnten).

Ein IEnumerable ist eine Sache, die aufgezählt werden kann ... was einfach bedeutet, dass es eine GetEnumerator-Methode hat, die ein IEnumerator zurückgibt.

Welche verwendest du Der einzige Grund für die Verwendung von IEnumerator besteht darin, dass Sie eine nicht standardmäßige Art der Aufzählung verwenden (dh die verschiedenen Elemente einzeln zurückgeben) und definieren müssen, wie dies funktioniert. Sie würden eine neue Klasse erstellen, die IEnumerator implementiert. Sie müssten jedoch immer noch IEnumerator in einer IEnumerable -Klasse zurückgeben.

Um zu sehen, was für ein Enumerator (Implementierung von IEnumerator<T>) sieht aus wie, siehe Enumerator<T> Klasse, wie die in List<T>, Queue<T>, oder Stack<T>. Ein Beispiel für eine Klasse, die IEnumerable implementiert, finden Sie in einer beliebigen Standardauflistungsklasse.

65
Ryan Lundy

Ein Enumerator zeigt Ihnen die Elemente in einer Liste oder Sammlung. Jede Instanz eines Enumerators befindet sich an einer bestimmten Position (das 1. Element, das 7. Element usw.) und kann Ihnen dieses Element geben (IEnumerator.Current) oder gehe zum nächsten (IEnumerator.MoveNext). Wenn Sie eine foreach -Schleife in C # schreiben, generiert der Compiler Code, der einen Enumerator verwendet.

Eine Enumerable ist eine Klasse, die Ihnen Enumerators geben kann. Es gibt eine Methode namens GetEnumerator, mit der Sie ein Enumerator erhalten, das sich die Elemente ansieht. Wenn Sie eine foreach - Schleife in C # schreiben, ruft der erzeugte Code GetEnumerator auf, um die von der Schleife verwendete Enumerator zu erstellen.

15
SLaks

IEnumerable und IEnumerator sind beide Schnittstellen. IEnumerable hat nur eine Methode namens GetEnumerator. Diese Methode gibt (da alle Methoden etwas zurück, einschließlich void) einen anderen Typ zurück, der eine Schnittstelle ist und diese Schnittstelle IEnumerator ist. Wenn Sie eine Enumeratorlogik in einer Ihrer Auflistungsklassen implementieren, implementieren Sie IEnumerable (entweder generisch oder nicht generisch). IEnumerable hat nur eine Methode, während IEnumerator 2 Methoden (MoveNext und Reset) und eine Eigenschaft Current hat. Zum leichteren Verständnis betrachten Sie IEnumerable als eine Box, die IEnumerator enthält (allerdings nicht durch Vererbung oder Einschließung). Siehe den Code zum besseren Verständnis:

class Test : IEnumerable, IEnumerator
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    public object Current
    {
        get { throw new NotImplementedException(); }
    }

    public bool MoveNext()
    {
        throw new NotImplementedException();
    }

    public void Reset()
    {
        throw new NotImplementedException();
    }
}
9
James Kingsbery