Frage

Ist es sicher anzunehmen, dass zwei itterations über die gleiche Sammlung werden die Objekte in der gleichen Reihenfolge zurückkehren? Offensichtlich ist, wird angenommen, dass die Sammlung nicht anders geändert.

War es hilfreich?

Lösung

Kurze Antwort -. Ja

Natürlich, obwohl, kann die Reihenfolge der Elemente in der Auflistung nicht genau, wie sie eingeführt wurden, von der Art der Sammlung abhängig (ein Wörterbuch, zum Beispiel).

Aber Sie werden die gleichen Ergebnisse jedes Mal, wenn Sie iterieren über eine einzige, nicht-modifizierten Sammlung mit einer foreach-Schleife erhalten.

Andere Tipps

Es hängt von dem Kollektionstyp. Für die meisten Sammlungen, die Antwort ist „Ja“.

Dies ist jedoch nicht garantiert. Die Dokumente aus einer Sammlung Typ sollten festgelegt werden, ob es funktioniert, aber da die meisten tun, ist dieses Detail im Allgemeinen übersehen. Wenn es jedoch nicht stabil ist, wäre es ein enormes Versehen sein, wenn die Dokumente, dass nicht erwähnt.

Sie können dies nicht garantieren, wenn Sie die konkrete Umsetzung der Klasse wissen über Sie laufen.

Sammlungen, die eine definierte Reihenfolge Elemente (z.B. List<T>) in einer stabilen Reihenfolge aufzuzählen wird.

Für Sammlungen, wo der Zustand des Objekts es ändert sich nicht sehr wahrscheinlich, dass die Elemente wieder in der gleichen Reihenfolge kommen, z.B. Dictionary<K,V>, obwohl dies nicht durch die Spezifikation garantiert.

Als Beispiel, wo dies nicht der Fall wäre, könnten Sie eine Hash-Tabelle basiert Wörterbuch Implementierung vorstellen, die die Tabelle asynchron komprimiert oder passt. Eine solche Implementierung würde eine stabile Iterationsreihenfolge nicht garantieren.

Während die Antwort „Ja“ für alle eingebauten Sammlungen ist und wahrscheinlich jede vernünftige Sammlung Klasse gibt, ist die Dokumentation keine Einschränkungen für IEnumerable formuliert haben. Daher nichts sagt uns, dass jede Iteration muss stabil sein.

Ich kann den folgenden Anwendungsfall vorstellen:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
    Console.WriteLine(i);

Dies könnte auch eine Klasse implementiert werden, das eine andere Anordnung für jede Iteration ergibt.

Also - wenn Sie auch seltsame Grenzfälle betrachten will, sollte die Antwort sein „ nicht

.

Während der Regel werden die Elemente in der gleichen Reihenfolge zurückgegeben werden, gibt es absolut keine Garantie. Es ist völlig abhängig von der internen Umsetzung der Kollektionsklasse.

ich einen Fall für eine Sammlung Klasse sehen, die in einer zufälligen Reihenfolge Elemente zurückzukehren, zum Beispiel speziell entwickelt wird.

Kurz gesagt, wenn Sie die interne Implementierung der Kollektionsklasse kennen, nicht etwas über die Bestellung übernehmen.

Linq definiert den IOrderedEnumerable Schnittstelle für diesen Zweck.

Re „unmodifizierten“ (NM Antwort) - beachten Sie, dass viele komplexe Container wie Wörterbuch garantieren nicht, um die Ordnung aufrechtzuerhalten. Manchmal ein Element hinzugefügt wird es zuletzt erscheinen (was den Eindruck erweckt, dass Bestellung erhalten bleibt), und manchmal wird es die inneren Eimer dazu führen, neu zu organisieren, eine ganz andere Ordnung zu geben.

Dinge wie SortedList <,> usw. offensichtlich ihre eigenen Regeln haben.

Ich würde sagen, dass für die meisten Sammlung es sicher ist, dies zu übernehmen. Es ist nicht über die Grenzen der Möglichkeit, dass eine bestimmte Sammlung den Enumerator in einer nicht-deterministischen Art und Weise implementiert haben könnte, aber das ist wahrscheinlich nicht passieren wird ...

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