Sortieren ObservableCollection<string> über C#
Habe ich unten ObservableCollection<string>
. Ich muss Art diese alphabetisch.
private ObservableCollection<string> _animals = new ObservableCollection<string>
{
"Cat", "Dog", "Bear", "Lion", "Mouse",
"Horse", "Rat", "Elephant", "Kangaroo", "Lizard",
"Snake", "Frog", "Fish", "Butterfly", "Human",
"Cow", "Bumble Bee"
};
Versuchte ich _animals.OrderByDescending
. Aber ich weiß nicht, wie es richtig zu verwenden.
_animals.OrderByDescending(a => a.<what_is_here_?>);
Wie kann ich dies tun?
Mögliche Duplikate von: stackoverflow.com/questions/16562175, stackoverflow.com/questions/5803786.
Kuck mal hier stackoverflow.com/questions/3973137/...
Kuck mal hier stackoverflow.com/questions/3973137/...
InformationsquelleAutor Bishan | 2013-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einführung
Grundsätzlich, wenn es notwendig ist, zeigt eine sortierte Auflistung, bitte erwägen Sie die Verwendung der
CollectionViewSource
Klasse: assign ("binden"), seinenSource
- Eigenschaft, um die source-Sammlung — eine Instanz derObservableCollection<T>
Klasse.Die Idee ist, dass
CollectionViewSource
- Klasse stellt eine Instanz desCollectionView
Klasse. Dies ist eine Art "Projektion" von der original (Quell -) Sammlung, aber mit angewendet Sortieren, filtern, etc.Referenzen:
Leben Gestalten
WPF 4.5 stellt das "Live-Shaping" - Funktion für
CollectionViewSource
.Referenzen:
Lösung
Wenn es immer noch die Notwendigkeit zum Sortieren einer Instanz der
ObservableCollection<T>
Klasse, hier ist, wie es getan werden kann.Die
ObservableCollection<T>
Klasse selbst keine sort-Methode. Aber die Sammlung könnte neu erstellt werden, um Elemente sortiert:Weitere details
Bitte beachten Sie, dass
OrderBy()
undOrderByDescending()
Methoden (wie andere LINQ–extension-Methoden) nicht ändern die Quelle collection! Sie stattdessen erstellen Sie eine neue Sequenz (d.h. eine neue Instanz der Klasse, dieIEnumerable<T>
- Schnittstelle). Daher ist es notwendig, neu zu erstellen die Sammlung.Recht. Danke!!! Habe soeben die Antwort auf den Kontext angeben, genauer gesagt.
Wenn Sie (als würden Sie bei der Verwendung von, sagen wir, das MVVM-Pattern) verwendet, eine Eigenschaft (die in einer Klasse Implementiert die INotifyPropertyChanged-Schnittstelle), um die ObservableCollection, um die neue version sortiert und Setter-Aufrufe der Interface-das PropertyChanged-Ereignis, dann ist die Bindung nicht gebrochen werden.
Was ich gemeint habe, durch das brechen der Bindung ist, dass, wenn Sie gebunden sind, eine Eigenschaft, die mit dem Ausgewählten Element für die Observable-collection, dann ist das break nach der Erholung von der Erfassung als Ihr neu zugewiesen, die Sergey geklärt sein Nächstes Bearbeiten.
Ah, verstanden. Thx!!!
InformationsquelleAutor Sergey Brunov
Ich weiß, ist eine alte Frage, aber ist das erste google Ergebnis für "Art observablecollection", so dachte, es lohnt sich, zu verlassen, meine zwei cent.
Den Weg
Den Weg, den ich gehen würde ist der Bau einer
List<>
ab derObservableCollection<>
Sortieren (durch seineSort()
Methode, mehr auf der msdn-Website) und wenn dieList<>
wurden sortiert, die Reihenfolge derObservableCollection<>
mit derMove()
Methode.Den code
Der test
Hinweis: Laut MSDN-Website, die "ObservableCollection.IndexOf" - Methode ist "eine O(n) - operation, wobei n für die Anzahl" und ich vermute, der "ObservableCollection.Move" - Methode ruft die "ObservableCollection.RemoveAt" und "ObservableCollection.Insert" - Methoden, von denen jede (wieder laut MSDN) - auch "ein O(n) - operation, wobei n Count". Weiter im nächsten Kommentar...
Falls-run-time ist von Bedeutung, ich vermute, Sie sind viel besser, neu zu erstellen, die "ObservableCollection" mit der sortierten Liste (D. H. mit der "ObservableCollection<T>(List<T>)" - Konstruktor). Wie ich gerade kommentiert "D_Learning"'s Kommentar zu "Sergej Brunov"'s Antwort oben: "Wenn Sie (als würden Sie bei der Verwendung von, sagen wir, das MVVM-Pattern) verwendet, eine Eigenschaft (die in einer Klasse Implementiert, dass "die INotifyPropertyChanged-Interface"), um die "ObservableCollection", um die neue version sortiert und Setter-Aufrufe der Schnittstelle "PropertyChanged" - Ereignis, dann ist die Bindung nicht gebrochen werden."
Bindungen würden nicht gebrochen werden, aber alle Abonnements (mit code) zu jedem Element der Fall wäre. Auf top von, dass, wieder die Sammlung von Grund auf neu, die gebundenen UI-element (es wäre ein listview-oder was immer Sie wollen) die vielleicht neu aufbauen müssen alle visuellen Elemente, die potenziell sehr viel mehr (in Zeit und/oder Speicher-Verbrauch), dann ein 3*O(n) - iteration... So, endlich die richtige Antwort ist immer die gleiche: es hängt davon ab. Dies ist nur ein alternativer Weg zu gehen, wenn Sie nicht können oder nicht wollen, um den Neuaufbau Ihrer Liste.
Ich war in der Lage, dies umzusetzen und es funktionierte großartig in meiner WPF-Anwendung, wo, wenn die Bindungen gebrochen, die Sammlung würde nicht aufgefüllt haben, in meinen Listboxen. Die Daten kamen durch sortiert zurück in die Kisten einfach gut. Also sagen wir, ich habe ein Modell:
public class Computer { public string Name { get; set; } }
, wo ich wollte, alphabetisch geordnetenName
Werte, und ich hatte eineObservableCollection<Computer> myList
, dann hieß es:myList.Sort((a, b) => { return a.Name.CompareTo(b.Name); });
. Denken Sie daran, wenn Sie das hinzufügen der Methode Marco vorausgesetzt, es geht in einepublic static class Extensions { ... }
in Ihrem Namensraum.InformationsquelleAutor Marco
Erstellte ich eine extension-Methode, um die ObservableCollection
Scheint es zu funktionieren, und Sie brauchen nicht zu implementieren IComparable
InformationsquelleAutor Lance
Ich sah diese, ich war immer sortiert, und dann brach die Bindung, wie oben beschrieben. Kam mit dieser Lösung, aber einfacher als die meisten von Ihnen, es scheint das zu tun, was ich will,,,
InformationsquelleAutor John Leone
Dies ist ein
ObservableCollection<T>
, dass automatisch sortiert sich auf eine änderung, löst eine Art, die nur bei Bedarf und nur Trigger einen einzigen move-Sammlung ändern, Aktion.Ausgabe:
Gute Lösung, funktioniert Super in der Echtzeit! Einige Kommentare: Absteigend Umgekehrt (korrigieren müssen); wem das nicht installiert werden soll Nuget für Tupel ersetzen Sie einfach "(Element: item, Index: index));" -> "neue { Index = index, Element = Element });" und "(OldIndex: tuple.Index, Besetzte: index))" -> "neue { OldIndex = Tupel.Index, Besetzte = index })".
InformationsquelleAutor Shimmy
Dem argument zu
OrderByDescending
ist eine Funktion, die die Rückgabe der Schlüssel zu Sortieren. In Ihrem Fall, der key ist der string selbst:Wenn Sie wollte, Sortieren nach Länge-so werden Sie zum Beispiel schreiben:
OrderByDescending()
Methode aufrufen.Ich habe versucht, diese vor. aber nicht funktionierte 🙁
Es funktioniert nicht wegen dem, was @Sergej Brunov erklärt. Sie müssen speichern Sie das Ergebnis in einer anderen variable.
Danke für den Tipp 🙂
InformationsquelleAutor manji
Wenn Tiere wäre eine Liste von Objekt, Tier, könnte man eine Eigenschaft, um die Reihenfolge in der Liste.
OrderByDescending()
Methode aufrufen.Genau: Sie sollten sagen: Tiere = Tieren.OrderByDescending(ein => ein.Name);
Ich bekomme Nicht in der ObservableCollection zu OrderedObservableCollection Fehler.
Und das funktioniert nicht. Es ist nicht möglich, zuweisen geordnete Sammlung zu ObservableCollection<T>, denn nach der Sortierung werden IOrderedEnumerable<T>, erhalten Sie Fehler.
animals = new ObservableCollection<Animal>(animals.OrderByDescending(a => a.Name));
Dies rund um die IOrderedEnumerable Fehler.InformationsquelleAutor Bram Van Strydonck
InformationsquelleAutor SabariMurugan Sivakumar
Diese Lösung basiert auf Marco ' s Antwort. Ich hatte einige Probleme mit seiner Lösung und daher verbessert werden müssen, es nur durch Berufung
Move
wenn der index geändert hat. Dies sollte die performance verbessern und auch fix die verlinkten Thema.InformationsquelleAutor Tim Pohlmann
Habe ich eine Sortierung über eine bestimmte class-Feld (Abstand).
InformationsquelleAutor Kairat Koibagarov