Frage

Ich bin falle diese Zeile nach verschiedenen Websites besucht zu haben benutzerdefinierte Enumeration, um zu versuchen zu verstehen Echtzeit Beispiel für die Verwendung. Ich habe Beispiele. Aber sie führen mich zu Verwirrung.

Beispiel:

Nehmen Sie 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

Take 2

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

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

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

Haupt

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

Take 2 folgte ich die benutzerdefinierte Iteration den gleichen Integer-Array zu durchlaufen wie ich in nehmen 1. Warum sollte ich schlagen um den heißen Brei eine ganze Zahl zu wiederholen, indem Sie benutzerdefinierte Iteration

Wahrscheinlich vermisste ich die in Echtzeit individuelle Iteration aus Bedarf. Können Sie mir die Aufgabe erklären, die ich mit den vorhandenen Iteration Anlage nicht kann? ( ich meine Ausbildung gerade abgeschlossen, so gib mir ein einfaches Beispiel, so dass ich verstehen kann es richtig ).

Update: Ich habe diese Beispiele von einigen Seiten. Es ist nichts Besonderes in diesem Code, können wir es sehr einfach, auch ohne Verwendung von benutzerdefinierter Iteration erreichen können, war mein Interesse an das reale Szenario zu wissen, wo benutzerdefinierte Iteration ganz praktisch ist.

War es hilfreich?

Lösung

Benutzerdefinierte Iteratoren sind nützlich, wenn die Ressourcen, die Sie Iterieren sind im Speicher nicht vorinstalliert, sondern als in jeder Iteration benötigt erhalten. Zum Beispiel in LINQ to SQL, wenn Sie so etwas wie:

foreach(var employee in dataContext.Employees) {
    // Process employee
}

in jedem Schritt der foreach Schleife, die Employees-Tabelle in der Datenbank abgefragt, um den nächsten Datensatz zu erhalten. Auf diese Weise, wenn Sie die Schleife vorzeitig verlassen, haben Sie die gesamte Tabelle nicht lesen, sondern nur die Datensätze, die Sie benötigen.

Sehen Sie hier für ein reale Welt Beispiel: aufzuzählen Linien auf einer Datei . Hier wird jede Zeile aus der Datei auf jeder Iteration der Schleife foreach lesen. (Als eine Randnotiz, .NET Framework 4 bietet die gleiche Funktionalität eingebaut).

Andere Tipps

Um ehrlich zu sein, ich bin nicht ganz sicher, was Sie fragen, aber wenn man über den Unterschied besorgt ist zwischen Rückgabe eines Arrays (wie in Take 1) und wiederkehr einen Iterator (take 2), hier ist meine Antwort .

Es gibt einen großen Unterschied zwischen einem Array zurückkehrt und einen Iterator zurück. Rückgabe eines Arrays bedeutet internen Zustand zurückkehrt (es sei denn, Sie eine Kopie als Teil der Rückkehr machen, aber das ist teuer). Wenn Sie einen Iterator zurückkehren, kehren Sie nur eine Abstraktion, die Anrufer Zustand durchlaufen lassen. Das bedeutet auch, dass Sie faul Auswertung tun können, wenn Sie (etwas kann man natürlich nicht tun, wenn Sie einen Array sind Rückkehr) benötigen.

Auch mit der Unterstützung für Iteratoren in C # 2, gibt es wirklich keinen Grund, von Hand IEnumerable zu implementieren. Bitte beachten Sie, diese Frage für weiteres Detail Kann jemand die Ausbeute Schlüsselwort entmystifizieren?

So wie ein anderes Beispiel, bei dem benutzerdefinierte Iteration in der Vergangenheit nützlich für mich gewesen war, eine gemeinsame Abstraktion zu schaffen, um rekursiv alle Knoten in einer Baumstruktur aufzuzählen ...

foreach (Node n in tree)
  //...do something
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top