Garantiert eine Liste <T>, dass Artikel in der Reihenfolge zurückgegeben werden, in der sie hinzugefügt wurden?

80

List<T>Garantiert a immer, dass Artikel in der Reihenfolge zurückgegeben werden, in der sie bei der Aufzählung hinzugefügt wurden?

Aktualisiert : Danke für all die Antworten, Leute, beruhigt mich. Ich habe michList<T>mit .NET Reflectorschnell in derKlasse umgesehen (hätte das wahrscheinlich an erster Stelle tun sollen), und tatsächlich ist der zugrunde liegende Speicher ein Array vonT(T[]).

Kev
quelle
20
Obwohl wir jetzt sowohl durch Experimente als auch durch Reverse Engineering festgestellt haben, dass List <T> in seiner aktuellen Form tatsächlich die Ordnung beibehält, wäre es schön, wenn Microsoft es offiziell machen und diese Garantie in die Dokumentation aufnehmen würde. Hat jemand, der dies liest, eine gewisse Schlagkraft?
IJ Kennedy
2
@IJKennedy effin A! und das gilt für eine ganze Reihe weiterer MS-Dokumente. +1 für dich. (+100 wenn ich könnte). Es gibt Tausende, vielleicht Millionen von MS-Entwicklern, die Zeit mit Reverse Engineering, Tests usw. verbringen, alles wegen des Fehlens einiger Worte von MS. Ist ihnen das nicht klar? Die Jahre vergehen und nichts ändert sich.
Jason S

Antworten:

68

Die Liste ist indexbasiert und neue Elemente werden immer am Ende der Liste hinzugefügt. Sie können Elemente an einem bestimmten Index einfügen, damit die nächsten Elemente um eine Position verschoben werden.

Also ja , so können Sie es sicher benutzen ...

Die List (T) -Klasse ist das generische Äquivalent der ArrayList-Klasse. Es implementiert die generische IList (T) -Schnittstelle mithilfe eines Arrays, dessen Größe nach Bedarf dynamisch erhöht wird.

Auf Elemente in dieser Sammlung kann über einen Ganzzahlindex zugegriffen werden. Indizes in dieser Sammlung basieren auf Nullen.

Es ist nicht garantiert, dass die Liste (T) sortiert ist. Sie müssen die Liste (T) sortieren, bevor Sie Vorgänge (z. B. BinarySearch) ausführen, bei denen die Liste (T) sortiert werden muss.

Eine Liste (T) kann mehrere Leser gleichzeitig unterstützen, solange die Sammlung nicht geändert wird. Das Aufzählen durch eine Sammlung ist an sich keine thread-sichere Prozedur. In dem seltenen Fall, dass eine Aufzählung mit einem oder mehreren Schreibzugriffen konkurriert, besteht die einzige Möglichkeit, die Thread-Sicherheit zu gewährleisten, darin, die Sammlung während der gesamten Aufzählung zu sperren. Damit mehrere Threads zum Lesen und Schreiben auf die Sammlung zugreifen können, müssen Sie Ihre eigene Synchronisierung implementieren.

Sie können mehr darüber auf MSDN lesen .

Schleifer Versluys
quelle
1
Es scheint, dass das Dokument für Liste <T> nicht angibt, dass die Reihenfolge des Abrufs mit der Reihenfolge des Einfügens übereinstimmt. Im Moment verhält es sich so, aber es ist nicht dokumentiert, dies zu tun.
Cheeso
Das ist in der Tat richtig, es ist immer gut, sich dessen bewusst zu sein und wenn es absolut kritisch ist, nicht darauf zu zählen!
Sander Versluys
@Cheeso Es garantiert die Reihenfolge des Abrufs. Ich habe eine Antwort hinzugefügt, die dieses Detail enthält.
Alex Angas
Hallo. Sie wissen, ob das Verhalten bei der Inline-Initialisierung identisch ist?
Gioce90
9

Ja, List<T>garantiert sowohl die Einfügereihenfolge als auch die Abrufreihenfolge und dies ist auf MSDN dokumentiert (Hervorhebung unten ist meine).

Einfügen

List<T>.Add Methode

Fügt am Ende desList<T> ein Objekt hinzu .

Artikelparameter ist:

Das Objekt, das am Ende desList<T> hinzugefügt werden soll .

List<T>.AddRange Methode

Fügt die Elemente der angegebenen Sammlung am Ende desList<T> .

Der Erfassungsparameter lautet:

Die Sammlung, deren Elemente am Ende desList<T> hinzugefügt werden sollen .

Abruf

List<T>.Enumerator Struktur

Zunächst wird der Enumerator vor dem ersten Element in der Sammlung positioniert. An dieser Position Currentist undefiniert. Daher müssen Sie aufrufen MoveNext, um den Enumerator zum ersten Element der Auflistung zu bringen, bevor Sie den Wert von lesen Current.

CurrentGibt dasselbe Objekt zurück, bis MoveNextes aufgerufen wird. MoveNextsetzt Currentauf das nächste Element .

Alex Angas
quelle
3
Alex, ich denke, Sie sind möglicherweise zu einem Schluss gekommen, der nicht gerechtfertigt ist. "Das erste Element in der Sammlung" ist nicht unbedingt dasselbe wie "das erste Element, das der Sammlung hinzugefügt wurde". Ebenso mit dem "letzten Element". Das Dokument sagt nichts darüber aus, dass die Reihenfolge des Abrufs mit der Reihenfolge des Einfügens zusammenhängt.
Cheeso
Fragen Sie sich nur, does AddRange()behalten Sie die Reihenfolge der übergebenen Elemente bei, oder können Sie die Reihenfolge ändern, in der sie dem internen Array hinzugefügt werden? (Offensichtlich werden sie alle am Ende der aktuellen Liste sein)
Ryan Buddicom
Alex ist richtig. Die Add-Methoden von Microsoft beziehen sich speziell auf die Reihenfolge der Liste (in diesem Fall Ende). Ebenso wie die Insert-Methoden ('angegebener Index').
Chalky
Sobald Sie feststellen, dass Listen <> Array-Indexer und die Insert () -Methode (die einen Index verwendet) haben, sollte es offensichtlich sein, dass sie sortiert werden müssen. Für beide Funktionen ist dies erforderlich. Diese Methoden bilden einen Vertrag mit dem Endbenutzer der Klasse, dass diese Werte am angegebenen Speicherort verfügbar sind, sofern Sie sie nicht später verschieben.
Krowe2
Scheint, dass die Dokumente aktualisiert wurden? Es wird jetzt zu den AddRange-Beschreibungen hinzugefügt: l docs.microsoft.com/en-us/dotnet/api/… > Die Reihenfolge der Elemente in der Sammlung wird in der Liste <T> beibehalten.
Depechie
4

Ja. Aber es ist nicht Teil der Spezifikation.

Ref: Listenklasse

Mitch Wheat
quelle
In diesem Fall wäre abhängig von diesem speziellen Implementierungsdetail ein Fehler, nicht wahr?
Cheeso
3
Ich kann keine Referenz dafür finden, können Sie eine zitieren?
Annakata
1

Ja, laut diesem MSDN-Forum-Thread

Spencer Ruport
quelle
1
Dies ist eine Antwort nur für Links. Gibt es eine Möglichkeit, den Kontext dieses Links anzugeben?
Alex Angas