Frage

Ein Interview Frage für einen Job .NET 3.5 ist "Was ist der Unterschied zwischen einem Iterator und einem Enumerator"?

Dies ist ein Kern Unterschied zu machen, was mit LINQ, etc.

Wie auch immer, was ist der Unterschied? Ich kann nicht scheinen eine solide Definition im Netz zu finden. Machen Sie keinen Fehler, kann ich die Bedeutung der beiden Begriffe finden, aber ich etwas andere Antworten. Was wäre die beste Antwort für ein Interview sein?

IMO ein Iterator „iteriert“ über eine Sammlung und eine enumerator bietet die Funktionalität zu durchlaufen, aber das hat genannt werden.

Auch mit der Ausbeute Schlüsselwort wird gesagt Zustand zu speichern. Was genau ist dieser Zustand? Gibt es ein Beispiel für diesen Vorteil auftritt?

War es hilfreich?

Lösung

Iterieren bedeutet, einige Schritte zu wiederholen, während Mittel aufzählt gehen durch alle Werte in einer Sammlung von Werten. So Aufzählen erfordert in der Regel eine Form der Iteration.

Auf diese Weise Aufzählen ist ein Spezialfall von Iterieren, wo der Schritt einen Wert aus einer Sammlung erhält.

Beachten Sie die „in der Regel“ - Aufzählen auch rekursiv durchgeführt werden können, aber Rekursion und Iteration sind so eng miteinander verbunden, dass ich nicht diesen kleinen Unterschied sorgen würde

.

Sie können auch Werte aufzählen Sie nicht explizit in einer Sammlung lagern. Zum Beispiel können Sie die natürliche Zahl, Primzahlen aufzählen, oder was auch immer, aber Sie würden diese Werte bei der Aufzählung berechnen und sie nicht von einer physischen Sammlung abzurufen. Sie verstehen, diesen Fall als eine virtuelle Sammlung mit ihren Werten durch eine Logik definiert aufzählt.


Ich gehe davon aus Reed Copsey den Punkt. In C # gibt es zwei große Möglichkeiten, etwas aufzuzählen.

  1. Implementieren Enumerable und eine Klasse der Umsetzung IEnumerator
  2. Implementieren Sie einen Iterator mit der yield Anweisung

Der erste Weg ist schwieriger zu implementieren und verwendet Objekte für aufzählt. Der zweite Weg ist einfacher zu implementieren und verwendet Fortsetzungen.

Andere Tipps

In C # 2 +, Iteratoren ist eine Möglichkeit für den Compiler der IEnumerable und / oder IEnumerable Schnittstellen für Sie automatisch zu generieren.

Ohne Iteratoren, müssten Sie eine Klasse erstellen Implementierung IEnumerator , einschließlich Strom, Movenext und Reset. Dies erfordert eine Menge Arbeit. Normalerweise würden Sie eine private Klasse, die IEnumerator für Ihre Art implemtented, dann yourClass.GetEnumerator () würde diese private Klasse konstruieren, und es zurück.

Iteratoren ist eine Möglichkeit für den Compiler automatisch generiert dies für Sie, eine einfache Syntax (Ausbeute) verwendet wird. Auf diese Weise können Sie GetEnumerator () direkt in Ihrer Klasse implementieren, ohne eine zweite Klasse (Die IEnumerator) von Ihnen spezifiziert wird. Der Bau dieser Klasse, mit allen seinen Mitgliedern, ist für Sie erledigt.

Iteratoren ist sehr entwicklerfreundlich - die Dinge auf eine sehr effiziente Art und Weise getan, mit viel weniger Aufwand

.

Wenn Sie foreach verwenden, verhalten sich die beiden identisch (vorausgesetzt, Sie schreiben Ihre benutzerdefinierte IEnumerator korrekt). Iteratoren nur Leben viel einfacher.

Was C # ruft ein Iterator ist häufiger (außerhalb der C # Welt) genannt Generator oder Generatorfunktion (zB in Python). Eine Generatorfunktion ist ein spezialisierter Fall von Koroutine . Ein C # Iterator (Generator) ist eine besondere Form eines enumerator (ein Datentyp der IEnumerable Schnittstelle implementiert).

Ich mag nicht diese Verwendung des Begriffs Iterator für eine C # Generator, weil es einfach so viel ein Enumerator ist, wie es ein Iterator ist. Zu spät für Microsoft obwohl seine Meinung zu ändern.

Gegensatz zu berücksichtigen, dass in C ++ ein Iterator ist ein Wert, der in erster Linie verwendet wird sequentielle Elemente in einer Sammlung zuzugreifen. Es kann vorgeschoben, derferenced wird, um einen Wert zu erhalten, und getestet, um zu sehen, ob das Ende der Auflistung erreicht ist.

Um Iteratoren verstehen müssen wir zuerst Enumeratoren verstehen.

Enumeratoren Fach Objekte sind, die man mit den Mitteln zur Verfügung stellen, eine geordnete Liste von Elementen einer nach dem anderen zu bewegen (die gleiche Art der Sache wird manchmal als ‚Cursor‘). Das .NET Framework bietet zwei wichtige Schnittstellen im Zusammenhang mit Aufzählungen: IEnumerator und IEnumerable. Objekte, die IEnumerator implementieren sind sich Aufzählungen; sie unterstützen die folgenden Mitglieder an:

  • die Eigenschaft Current, die auf der Liste in eine Position verweist

  • die Methode Movenext, die das aktuelle Element eine entlang der Liste bewegt

  • Die Methode Reset, die das aktuelle Element in seine Ausgangsposition bewegt (was vor dem ersten Element ist).

Auf der anderen Seite, implementieren Iterаtors der enumerаtor pаttern. .NET 2.0 die iterаtor eingeführt, das ist а Compiler-mаnifested enumerаtor. Wenn das Objekt enumerаble cаlls GetEnumerаtor, entweder direkt oder indirekt, аnd der Compiler generаtes kehrt аppropriаte iterаtor Objekt аn. Optionаlly, cаn die iterаtor а kombinierte enumerаble аnd enumerаtor Objekt sein.

Die essentiаl Bestandteil аn iterаtor Block ist die Ausbeute stаtement. Es gibt einen großen Unterschied zwischen iterаtors аnd enumerаtors: Iterаtors Sie die Reset-Methode nicht implementieren. Cаlling die Reset-Methode auf аn iterаtor cаuses аn Ausnahme.

Der Punkt von Iteratoren ist die einfache Implementierung von Aufzählungen zu ermöglichen. Wo ein Verfahren entweder einen Enumerator oder eine zählbare Klasse für eine geordnete Liste von Elementen zurückgeben muß, es steht geschrieben, um jeden Punkt in der richtigen Reihenfolge zurückzukehren, um die ‚Ertrag‘ Anweisung.

„Während eine foreach Aussage die Verbraucher des Enumerators ist, ein Iterator der Produzent des Enumerator ist.“

Das oben ist, wie „C # 5.0 in a Nutshell“, erklärt sie, und hat sich für mich hilfreich gewesen.

Mit anderen Worten, die foreach-Anweisung verwendet Movenext () und die Current-Eigenschaft des IEnumerator durch eine Sequenz zu durchlaufen, während der Iterator verwendet wird, um die Umsetzung des IEnumerator zu erzeugen, die von der foreach-Anweisung verwendet werden. In C #, wenn Sie eine Iteratormethode enthält eine yield-Anweisung schreiben, wird der Compiler einen eigenen Enumerator für Sie generieren. Und wenn Sie durch die Elemente in der Reihenfolge durchlaufen, wird es die Movenext () aufrufen und aktuelle Eigenschaft des privaten enumerator. Diese Methoden / Eigenschaften werden durch den Code in der Iteratormethode implementiert, die repeately aufgerufen wird, Werte zu erhalten, bis es keine Werte erhalten verlassen.

Das ist mein Verständnis, wie C # definieren Aufzählungen und Iteratoren.

Da keine Beispiele gegeben wurden, hier ist eine, die ich war hilfreich.

Ein Enumerator ist ein Objekt, das Sie erhalten, wenn Sie .GetEnumerator () auf einer Klasse oder Typ aufrufen, die die IEnumerator-Schnittstelle implementiert. Wenn diese Schnittstelle implementiert ist, haben Sie den gesamten Code erstellt, die für die compilor aktivieren Sie foreach zu „iterate“ über Ihre Sammlung zu verwenden.

Sie das Wort nicht bekommen ‚ITERATE“, obwohl mit Iterator verwirrt. Sowohl der Enumerator und der Iterator können Sie ‚iterate‘. Aufzählen und Iterieren sind im Grunde das gleiche Verfahren, aber unterschiedlich umgesetzt. Aufzählen heißt, Sie haben impleneted die IEnumerator-Schnittstelle. Iterieren bedeutet, dass Sie das Iterator-Konstrukt in Ihrer Klasse erstellt haben (unten gezeigt), und Sie fordern foreach auf Ihrer Klasse, zu welcher Zeit die compilor automatisch die enumerator Funktionalität für Sie erstellt.

Beachten Sie auch, dass Sie nicht hocken mit Ihrem enumerator zu tun haben. Sie können MyClass.GetEnumerator() den ganzen Tag rufen, und nichts tun mit ihm (Beispiel:

IEnumerator myEnumeratorThatIWillDoNothingWith = MyClass.GetEnumerator()).

Hinweis zu, dass Ihre Iterator in Ihrer Klasse bauen nur bekommt wirklich verwendet wird, wenn Sie es tatsächlich verwenden, das heißt Sie haben foreach auf Ihrer Klasse.

Hier ist ein Iterator Beispiel von Msdn :

public class DaysOfTheWeek : System.Collections.IEnumerable
{

     string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

     //This is the iterator!!!
     public System.Collections.IEnumerator GetEnumerator()
     {
         for (int i = 0; i < days.Length; i++)
         {
             yield return days[i];
         }
     }

}

class TestDaysOfTheWeek
{
    static void Main()
    {
        // Create an instance of the collection class
        DaysOfTheWeek week = new DaysOfTheWeek();

        // Iterate with foreach - this is using the iterator!!! When the compiler
        //detects your iterator, it will automatically generate the Current, 
        //MoveNext and Dispose methods of the IEnumerator or IEnumerator<T> interface
        foreach (string day in week)
        {
            System.Console.Write(day + " ");
        }
    }
}
// Output: Sun Mon Tue Wed Thr Fri Sat

"Iteratoren sind eine neue Funktion in C # 2.0. Ein Iterator ist eine Methode, erhalten Accessor oder Operator, der ohne foreach Iteration in einer Klasse oder Struktur unterstützen, kann die gesamte IEnumerable-Schnittstelle zu implementieren. Stattdessen Sie bieten nur eine Iterator, die einfach die Datenstrukturen in der Klasse durchläuft. Wenn der Compiler Ihre Iterator erkennt, wird automatisch den aktuellen, Movenext erzeugen und Methoden der IEnumerable oder IEnumerable-Schnittstelle entsorgen.“ - Msdn

Enumeration befasst sich mit Objekten, während Iteration befasst sich mit Werten nur. Enumeration wird verwendet, wenn wir Vektor-Hash-Tabelle usw. verwenden, während Iteration verwendet werden, in while-Schleife für Schleife usw. habe ich nie die Ausbeute Schlüsselwort verwenden, so könnte ich Ihnen nicht sagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top