Angenommen, ich habe 3 Zeichenfolgen in einer Liste (z. B. "1", "2", "3").
Dann möchte ich sie neu anordnen, um "2" an Position 1 zu platzieren (z. B. "2", "1", "3").
Ich verwende diesen Code (setze indexToMoveTo auf 1):
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
Dies scheint zu funktionieren, aber ich bekomme gelegentlich seltsame Ergebnisse; Manchmal ist die Reihenfolge falsch oder Artikel aus der Liste werden gelöscht!
Irgendwelche Ideen? Ist List<T>
Garantie Bestellung?
Verbunden:
c#
.net
collections
SuperSuperDev1234
quelle
quelle
Antworten:
Die
List<>
Klasse garantiert die Reihenfolge - die Dinge bleiben in der Liste in der Reihenfolge erhalten, in der Sie sie hinzufügen, einschließlich Duplikate, es sei denn, Sie sortieren die Liste explizit.Laut MSDN:
Die Indexwerte müssen zuverlässig bleiben, damit dies korrekt ist. Daher ist die Bestellung garantiert.
Möglicherweise erhalten Sie seltsame Ergebnisse aus Ihrem Code, wenn Sie das Element später in der Liste verschieben, da Sie
Remove()
alle anderen Elemente vor dem Aufruf an eine Stelle nach unten verschiebenInsert()
.Können Sie Ihren Code auf etwas reduzieren, das klein genug ist, um ihn zu veröffentlichen?
quelle
List
in einem guten Lehrbuch der Informatik überprüfen . Genau wieQueue
undStack
ist aList
eine gut definierte, vorhersehbare und gut verstandene Datenstruktur - wenn sich die .NET-Implementierung unterscheidet (oder wenn sie sich ändert), würde eine Menge Software kaputt gehen.Where()
die Liste mit der LINQ- Methode filtern, verlassen Sie sich auf die Implementierung, um die Elemente in der Reihenfolge der Reihe nach zu berücksichtigen. Es kommt vor, dass dies der Fall ist (siehe referencesource.microsoft.com/System.Core/System/Linq/… ), dies ist jedoch nicht in MSDN dokumentiert. Ich würde vorschlagen, zu verwenden,emp.LastOrDefault(x => x.empDept = 'abc')
da die Dokumentation vonLastOrDefault()
anzeigt, dass die Reihenfolge der Elemente beibehalten wird.Hier sind 4 Elemente mit ihrem Index
Sie möchten K zwischen A und E verschieben - Sie könnten an Position 3 denken. Sie müssen bei der Indizierung hier vorsichtig sein, da nach dem Entfernen alle Indizes aktualisiert werden.
Sie entfernen also zuerst Element 0 und verlassen es
Dann fügen Sie bei 3 ein
Um das richtige Ergebnis zu erhalten, sollten Sie Index 2 verwendet haben. Um die Konsistenz zu gewährleisten, müssen Sie an (indexToMoveTo-1) senden
if indexToMoveTo > indexToMove
, zDies kann mit Ihrem Problem zusammenhängen. Beachten Sie, dass mein Code nicht getestet wurde!
BEARBEITEN : Alternativ können Sie auch
Sort
einen benutzerdefinierten Vergleicher (IComparer
) verwenden, wenn dies für Ihre Situation gilt.quelle
Wie Bevan sagte, aber denken Sie daran, dass der Listenindex auf 0 basiert. Wenn Sie ein Element an den Anfang der Liste verschieben möchten, müssen Sie es am Index 0 einfügen (nicht 1, wie in Ihrem Beispiel gezeigt).
quelle
Dies ist der Code, den ich habe, um ein Element an einer Stelle in einer Liste nach unten zu verschieben:
und dies, um es um einen Platz nach oben zu bewegen:
folderImages
ist aListBox
natürlich, also ist die Liste aListBox.ObjectCollection
, nicht aList<T>
, aber sie erbt von,IList
also sollte sie sich gleich verhalten. Hilft das?Ersteres funktioniert natürlich nur, wenn das ausgewählte Element nicht das letzte Element in der Liste ist, und letzteres, wenn das ausgewählte Element nicht das erste Element ist.
quelle
Wenn Sie die Reihenfolge der Operationen ändern, vermeiden Sie das seltsame Verhalten: Fügen Sie zuerst den Wert an der richtigen Stelle in die Liste ein und löschen Sie ihn dann an seiner ersten Position. Stellen Sie sicher, dass Sie es durch seinen Index löschen, denn wenn Sie es als Referenz löschen, können Sie beide löschen ...
quelle