Ich habe mich über die Reihenfolge gewundert, in der eine foreach-Schleife in C # ein System.Collections.Generic.List<T>
Objekt durchläuft .
Ich habe eine andere Frage zum gleichen Thema gefunden, aber ich habe nicht das Gefühl, dass sie meine Frage zu meiner Zufriedenheit beantwortet.
Jemand gibt an, dass keine Reihenfolge definiert ist. Aber wie jemand anderes sagt, ist die Reihenfolge, in der ein Array durchlaufen wird, fest (von 0 bis Länge 1). 8.8.4 Die foreach-Anweisung
Es wurde auch gesagt, dass das Gleiche für alle Standardklassen mit einer Bestellung gilt (z List<T>
. B. ). Ich kann keine Dokumentation finden, um das zu sichern. Soweit ich weiß, könnte es jetzt so funktionieren, aber vielleicht wird es in der nächsten .NET-Version anders sein (auch wenn es unwahrscheinlich ist).
Ich habe mir auch die List(t).Enumerator
Dokumentation ohne Glück angesehen.
Eine andere verwandte Frage besagt, dass Java speziell in der Dokumentation erwähnt wird:
List.iterator()
Gibt einen Iterator über die Elemente in dieser Liste in der richtigen Reihenfolge zurück. "
Ich suche so etwas in der C # -Dokumentation.
Danke im Voraus.
Bearbeiten: Vielen Dank für all Ihre Antworten (erstaunlich, wie schnell ich so viele Antworten erhalten habe). Was ich aus allen Antworten verstehe, ist, dass List<T>
es immer in der Reihenfolge seiner Indizierung iteriert. Trotzdem würde ich mir eine klare Dokumentation wünschen, die dies ähnlich wie die Java-Dokumentation auf beschreibtList
.
quelle
foreach
wird definitiv in der Reihenfolge mit einem Array iterieren.In Ihrem Link heißt es in der akzeptierten Antwort in C # Language Specification Version 3.0, Seite 249 :
quelle
Die Reihenfolge wird durch den Iterator definiert, der zum Durchlaufen einer Datensammlung mithilfe einer foreach-Schleife verwendet wird.
Wenn Sie eine indexierbare Standardsammlung verwenden (z. B. eine Liste), wird die Sammlung beginnend mit Index 0 durchlaufen und nach oben verschoben.
Wenn Sie die Reihenfolge steuern müssen, können Sie entweder steuern, wie die Iteration der Sammlung behandelt wird, indem Sie Ihre eigene IEnumerable implementieren , oder Sie können die Liste nach Ihren Wünschen sortieren, bevor Sie die foreach-Schleife ausführen.
Dies erklärt, wie Enumerator für generische Listen funktioniert. Das aktuelle Element ist zunächst undefiniert und verwendet MoveNext, um zum nächsten Element zu gelangen.
Wenn Sie MoveNext lesen, bedeutet dies, dass es mit dem ersten Element der Sammlung beginnt und von dort zum nächsten wechselt, bis es das Ende der Sammlung erreicht.
quelle
Listen scheinen die Artikel in einer Reihenfolge zurückzugeben, in der sie sich im Hintergrundspeicher befinden. Wenn sie also auf diese Weise zur Liste hinzugefügt werden, werden sie auf diese Weise zurückgegeben.
Wenn Ihr Programm von der Reihenfolge abhängt, können Sie es sortieren, bevor Sie die Liste durchlaufen.
Es ist etwas albern für lineare Suchen - aber wenn Sie die Bestellung auf eine bestimmte Weise benötigen, ist es am besten, die Artikel in dieser Reihenfolge zu machen.
quelle
Ich musste nur etwas Ähnliches wie einen schnellen Hack von Code tun, obwohl es für das, was ich versuchte, nicht funktionierte, aber die Liste für mich neu ordnete.
Verwenden von LINQ zum Ändern der Reihenfolge
DataGridViewColumn[] gridColumns = new DataGridViewColumn[dataGridView1.Columns.Count]; dataGridView1.Columns.CopyTo(gridColumns, 0); //This created a list of columns gridColumns = (from n in gridColumns orderby n.DisplayIndex descending select n).ToArray(); //This then changed the order based on the displayindex
quelle
List
. Ich denke, Sie haben falsch verstanden, was ich mit "Liste" gemeint habe.Columns
nachgridColumns
? Ich denke, dass Sie auch einfach tun könnten:DataGridViewColumn[] gridColumns = dataGridView1.Columns.OrderByDescending(n => n.DisplayIndex).ToArray();