Stapel- und Queue-Aufzählungsreihenfolge

8

Ich weiß, dass List enumerator die Aufzählungsreihenfolge garantiert und die letzte Sortieroperation respektiert. Ich weiß, dass die Dictionary und HashSet one nicht NICHT sicher sein können, dass

%Vor%

verarbeitet Paare in der Reihenfolge, in der sie angehängt wurden.

Was ist mit dem Stack und dem Queue ? Bewerkstelligen ihre Aufzähler eine Bestellung?

    
Zverev Evgeniy 09.06.2016, 12:02
quelle

3 Antworten

4

Für Stack wird die Enumeration derzeit von einer verschachtelten privaten Klasse namens StackEnumerator ausgeführt (dies stammt von der Referenzquelle ):

%Vor%

Beachten Sie, dass es beginnend mit dem auf _stack._size-1 gesetzten Index auflistet und den Index dekrementiert, um jedes Element in LIFO-Reihenfolge zurückzugeben.

Da dies jedoch nicht dokumentiert ist, können Sie nicht garantieren, dass dies immer so ist (obwohl es für Microsoft verrückt wäre, die Funktionsweise des Enumerators zu ändern!) p>

Sie können die Implementierung der verschachtelten QueueEnumerator -Klasse überprüfen und auf ähnliche Weise feststellen, dass die Aufzählung in der Reihenfolge ausgeführt wird, in der Elemente aus der Warteschlange entfernt werden.

Der Stack.GetEnumerator () weist stark darauf hin, dass die LIFO-Reihenfolge verwendet wird.

Wenn Sie sich das Beispiel für Stack<T>.GetEnumerator() in der Microsoft-Dokumentation ansehen und überprüfen Sie die angegebene Ausgabe, Sie können sehen, dass es in LIFO-Reihenfolge ist.

Dies deutet stark darauf hin, dass Microsoft einen Stack vollständig in LIFO-Reihenfolge aufzählen möchte - aber sie haben vergessen (oder wollten es nicht), dies explizit zu dokumentieren!

    
Matthew Watson 09.06.2016, 12:15
quelle
4

Eine Warteschlange ist ein First-In-First- Out (FIFO) Sammlung (sagt so in der Dokumentation). Das bedeutet, dass der Enumerator die Elemente in der Reihenfolge angibt, in der sie hinzugefügt wurden.

Ein Stack ist ein Last-In-First- Out (LIFO) Sammlung. Das bedeutet, der Enumerator gibt Ihnen die Elemente in umgekehrter Reihenfolge ihrer Reihenfolge.

Stacks und Warteschlangen sind sehr standardisierte Computer Science-Konstrukte, so dass sie wirklich ohne ernsthafte Gegenreaktion nicht wiederverwendet werden können. Wenn Sie sich die Beispiele für die GetEnumerator() -Funktionen ansehen, dokumentiert dies eindeutig die Reihenfolge der Aufzählung:

Stack-Aufzählung:

%Vor%

Warteschlangenauflistung:

%Vor%

Auch hier muss ein Enumerator oder Iterator die Elemente in der natürlichen Reihenfolge für eine Sammlung darstellen. Bestimmte Sammlungsarten haben eine definierte Reihenfolge.

Vorbehalt

Bitte beachten Sie, dass der Aufzählungsprozess die natürliche Reihenfolge der FIFO- und LIFO-Sammlungen widerspiegelt ( ref ) ), dies ist nicht wie Warteschlangen ( ref ) und Stacks ( ref ) soll verwendet werden. Sie sollen mit den Interaktionen Enqueue() / Dequeue() und Push() / Pop() / Peek() verwendet werden. Microsoft schließt den Enumerator ein, um alles mit der Basis ICollection<T> interface konsistent zu halten, und hält den Enumerator in der natürlichen Reihenfolge der Sammlung.

Der Zweck einer Warteschlange besteht darin, eine Pipeline von Arbeiten bereitzustellen, die in der Reihenfolge verarbeitet werden können. Der Zweck eines Stapels besteht darin, eine Möglichkeit zu schaffen, zu einem vorherigen Kontext zurückzukehren, wenn die lokale Arbeit abgeschlossen ist. Sie sollen jeweils an einem Element arbeiten. Das Iterieren über die Sammlung mit einer Aufzählungsart von Seiten führt diesen ganzen Zweck durch und entfernt keine Elemente aus der Warteschlange / dem Stapel. Es ist im Wesentlichen ein Blick auf alle Gegenstände, die dort sind.

    
Berin Loritsch 09.06.2016 12:17
quelle
1

Ja. Es scheint nicht explizit dokumentiert zu sein, aber die Elemente werden in der gleichen Reihenfolge aufgelistet, wie wenn Sie sie entpackt / entfernt haben.

    
Thomas Levesque 09.06.2016 12:04
quelle

Tags und Links