Was ist der Unterschied zwischen IEnumerator und IEnumerable? [Duplikat]
-
03-07-2019 - |
Frage
Mögliche Duplizieren:
Kann mir jemand erklären IEnumerable und IEnumerator mir?
Was sind die Unterschiede zwischen IEnumerator und IEnumerable?
Lösung
IEnumerable ist eine Schnittstelle, die eine Methode definiert, GetEnumerator , die ein IEnumerator Schnittstelle, dies wiederum erlaubt Nur-Lese-Zugriff auf eine Sammlung. Eine Kollektion, 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();
Andere Tipps
Ein IEnumerator
ist eine Sache, die aufzählen kann. Es die Current
Eigenschaft hat und die MoveNext
und Reset
Methoden (die in .NET Code, den Sie wahrscheinlich nicht explizit nennen, obwohl Sie könnten)
Ein IEnumerable
ist eine Sache, die aufgezählt werden kann ... was einfach bedeutet, dass es eine Methode GetEnumerator hat, die ein IEnumerator
zurück.
Welche benutzen Sie? Der einzige Grund, IEnumerator
zu verwenden ist, wenn Sie etwas haben, das eine Nicht-Standard-Weise aufzuzählen hat (das heißt, seine verschiedenen Elemente der Rückkehr one-by-one), und Sie müssen festlegen, wie das funktioniert. Sie würden eine neue Klasse Umsetzung IEnumerator
erstellen. Aber Sie würden immer noch, dass IEnumerator
in einer IEnumerable
Klasse zurückgeben müssen.
Für einen Blick auf das, was ein Enumerator (implementierende IEnumerator<T>
) aussieht, sehen jede Enumerator<T>
Klasse, wie die enthaltenen diejenigen in List<T>
, Queue<T>,
oder Stack<T>
. Für einen Blick auf eine Klasse Implementierung IEnumerable
finden alle Standard-Collection-Klasse.
Ein Enumerator
zeigt Ihnen die Elemente in einer Liste oder Sammlung.
Jede Instanz eines Enumerator ist an einer bestimmten Position (dem ersten Element, das siebte Element, usw.) und können Sie das Element (IEnumerator.Current
) geben oder auf die nächste (IEnumerator.MoveNext
) bewegen. Wenn Sie eine foreach
Schleife in C # zu schreiben, erzeugt der Compiler Code, der eine Enumerator verwendet.
Ein Enumerable
ist eine Klasse, die Sie Enumerator
s geben kann. Es hat eine Methode namens GetEnumerator
, die Ihnen eine Enumerator
gibt, der an seinem Artikel aussieht. Wenn Sie eine foreach
Schleife in C # zu schreiben, der Code, der es Anrufe erzeugt GetEnumerator
die Enumerator
durch die Schleife verwendet erstellen.
IEnumerable und IEnumerator sind beide Schnittstellen. IEnumerable hat nur eine Methode namens GetEnumerator. Diese Methode Retuns einen anderen Typ (wie alle Methoden etwas einschließlich void zurückgeben), das ist eine Schnittstelle und die Schnittstelle IEnumerator. Wenn Sie Aufzählungslogik in jeder Ihrer Sammlung Klasse implementieren, implementieren Sie IEnumerable (entweder generische oder nicht generisch). IEnumerable hat nur eine Methode, während IEnumerator 2 Methoden zur Verfügung (Movenext und Reset) und eine Eigenschaft Current. Zum leichteren Verständnis betrachten IEnumebale eine Box, die IEnumerator Inneren enthält (wenn auch nicht durch Vererbung oder Eindämmung). Sehen Sie den Code für ein besseres 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();
}
}