Ist die .NET foreach-Anweisung garantiert eine Sammlung in der gleichen Reihenfolge zu durchlaufen, in dem es gebaut wurde?

StackOverflow https://stackoverflow.com/questions/612486

  •  03-07-2019
  •  | 
  •  

Frage

Ein Mitarbeiter verwendet eine for-Schleife eine Liste in einigen C # -Code iterieren er schrieb und den Kommentar verfasst, „did't Verwendung For Each, weil ich nicht sicher war, ob es um iteriert. Wer weiß, was Microsoft tut.“ Angenommen, wir haben eine Liste wie folgt aufgebaut:

var someList = new List<string>();

someList.Add("one");
someList.Add("two");
someList.Add("three");

meine Mitarbeiter verwendet, um etwas wie folgt aus:

for (int i = 0; i < someList.Count; i++)    
{
    System.Diagnostics.Debug.WriteLine(someList[i]);
}

statt dies:

foreach (var item in someList)              
{
    System.Diagnostics.Debug.WriteLine(item);
}

Ich glaube, er hat Angst, die Elemente in einer anderen Reihenfolge kommen könnten, als sie zu der Sammlung hinzugefügt wurden. Ich glaube, er ist ein bisschen paranoid, aber technisch gesehen, ist die Dokumentation nicht hervor, in welcher Reihenfolge die Sammlung iteriert. Ist es möglich, dass eine foreach-Anweisung einen Array oder Sammelobjekt in beliebiger Reihenfolge zu durchlaufen andere als von den niedrigsten bis zum höchsten gebunden?

War es hilfreich?

Lösung

Ihre Frage ist in Bezug auf einen List<T>, die Ordnung tut halten.

foreach, allein, ist nicht zu tun, was garantiert. Es fragt nur das Objekt, für seinen enumerator vorgesehen, die etwas tun konnten, möglicherweise.

Andere Tipps

Es hängt von der Sammlung:

  • Für List<T> es ist garantiert Auftrag sein. (Das ist nur Add Anrufe unter der Annahme, wie gezeigt. Wenn Sie Elemente in die Liste an bestimmten Stellen einfügen, würden sie an der richtigen pointas zurück bekommt man erwarten würde.) Im Grunde ist es die gleiche Reihenfolge wie Sie durch die entsprechenden list[0] bekommen würden, list[1] , list[2] etc.
  • Für Dictionary<TKey, TValue> gibt es keine garantierte Ordnung.
  • Für SortedList<TKey, TValue> (und dergleichen) in Schlüsselvergleich um sein werden -. Das ist der Punkt des Typs
  • Arrays kommen immer in Elemente um.

speziell auf die Frage zu beantworten, "foreach" gibt die Reihenfolge, dass die. GetEnumerator () zurückkehrt. Für Listen, es ist die Reihenfolge, dass Sie die Dinge am Ende hinzugefügt. Für Wörterbücher, es ist wahrscheinlich die Reihenfolge der Eimer, wo die Dinge zugewiesen wurden.

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