List Of spezifische Sortierung

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    List Of spezifische Sortierung

    Moin,


    ich stehe derzeit vor einem Problem mit der Sortierung einer List Of.

    Hier mal ein Beispiel:

    VB.NET-Quellcode

    1. Private Class Test
    2. Public Property ID As Integer = 0
    3. Public ReadOnly Property Name As String
    4. Get
    5. With Me
    6. Return .ID.ToString
    7. End With
    8. End Get
    9. End Property
    10. Sub New(ByVal ID As Integer)
    11. With Me
    12. .ID = ID
    13. End With
    14. End Sub
    15. End Class


    VB.NET-Quellcode

    1. Dim LstTest As New List(Of Test)
    2. With LstTest
    3. .Add(New Test(1))
    4. .Add(New Test(2))
    5. .Add(New Test(4))
    6. .Add(New Test(1))
    7. .Add(New Test(3))
    8. .Add(New Test(1))
    9. .Add(New Test(2))
    10. .Add(New Test(4))
    11. End With


    Ausgabe im DGV wäre demnach:
    1
    2
    4
    1
    3
    1
    2
    4

    Gibt es eine Möglichkeit, die LstTest so zu sortieren, dass z.B. alle Objekte mit ID 3 an erster Stelle sind (OrderBy...) und anschließend die 2 (.ThenBy ...), dann 1 (.ThenBy...)

    Gewünschte Ausgabe wäre: 3, 2, 2, 1, 1, 1, 4

    Das Test Objekt ist exemplarisch und wird bei mir später ein anderes Objekt sein. Das Prinzip bleibt aber das Selbe. Sortierung nach spezifischem Wert.

    Eine zusätzliche Property in der Klasse, welche die Sortierung enthält, möchte ich nicht erstellen.

    Ich denke versteht, was ich meine?

    Grüße :)
    Die List nutzt standardmäßig die Methode CompareTo() um Objekte zu sortieren. Damit die List das auch mit deinen Objekten macht, musst du das Interface IComparable Implementieren.

    CompareTo kannst du dann anhand deiner Kriterien einen Wert zurückgeben lassen, der angibt, ob dieses Objekt sich über, "neben", oder unter dem zu vergleichendem Objekt befindet.
    docs.microsoft.com/de-de/dotne…ompareto?view=netcore-3.1

    Wenn du natürlich eh schon dabei bist IComparable zu Implementieren, kannst du auch gleich IComparable(Of T) mit Implementieren. Dadurch bekommst du auch ein CompareTo(Test obj) sodass du in der einen auf Nothing und den richtigen Typ prüfst, und in der anderen auf den tatsächlichen Wert.
    Wenn Du schon mit OrderBy, also LINQ arbeitest, wo ist dann das Problem?

    VB.NET-Quellcode

    1. Dim SortedList = DeineList.OrderBy(…).ThenBy(…).ToList
    2. DeineList.Clear()
    3. DeineList.AddRange(SortedList)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    CompareTo bzw.IComparable werde ich mir mal anschauen, habe ich bisher noch nichts mit gemacht.

    OrderBy hilft mir in dem Sinne nicht, da ich nicht einfach absteigend oder aufsteigend sortieren möchte, sondern nach 2, dann 1, dann 5, oder B A C oder was auch immer.

    Das, wonach sortiert werden soll, entspricht nicht der logischen Reihenfolge (Zahl 0 bis 9 A bis Z oder umgekehrt).

    Beim Probieren ist mir gerade aufgefallen, dass die "Sortierung" wie ich sie möchte, auch so möglich wäre:

    VB.NET-Quellcode

    1. ​Dim LstTestSort = LstTest.OrderByDescending(Function(O1) O1.ID = 3).ThenByDescending(Function(O2) O2.ID = 2).ThenByDescending(Function(O3) O3.ID = 4)


    Wäre natürlich sehr statisch, aber im Prinzip genau das was ich will. Ergebnis ist dann 3, 2, 4 ...
    @BlueLagoonX Kannst Du Dein Sortierkriterium verbal beschreiben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Suchkriterium lege ich im Code fest.

    Speziell geht es um eine Liste aus Usern, die einen Status (Enum Wert) als Property beinhaltet.

    Das Enum ist (leider) nicht in Sinnvoller Reihenfolge, wodurch die Sortierung (1-10 z.B.) nicht möglich ist.

    Sortiert werden soll da z.B. nach 3 = Status.Aktiv, 2 = Status.Abgemeldet, 1 = Status.NichtAngemeldet, 4 = Status.Ausgefallen etc.

    User mit Status Aktiv sollen oben sein, anschließend nicht angemeldet, Abgemeldet und ausgefallen.

    BlueLagoonX schrieb:

    Das Enum ist (leider) nicht in Sinnvoller Reihenfolge
    Dann mach Dir ein weiteres internes Enum in der richtigen Reihenfolge, das eineindeutig mit dem "alten" Enum kommuniziert und sortiere nach dem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    BlueLagoonX schrieb:

    Gibt es eine Möglichkeit, die LstTest so zu sortieren, dass z.B. alle Objekte mit ID 3 an erster Stelle sind (OrderBy...) und anschließend die 2 (.ThenBy ...), dann 1 (.ThenBy...)

    Gewünschte Ausgabe wäre: 3, 2, 2, 1, 1, 1, 4
    Das wäre dann keine Sortierung, sondern eher eine Gruppierung. Dafür stellt Linq GroupBy bereit.
    Ist aber nicht ganz trivial, das richtig einzusetzen.
    Wenn du BeispielCode einstellst, wo einen Datenbestand bereitstellt, könnte ich eine Methode schreiben, die die Daten in die gewünschte Reihenfolge bugsiert.
    @RodFromGermany
    Das ist ein guter Vorschlag, ich werde es probieren und eine zusätzliche Property (z.B. Sort As Sortierung) beziehend auf dem ursprünglichen Enum erstellen.

    @ErfinderDesRades Auch wenn es gerade nach einer Gruppierung aussieht, es ist keine. Die Datensätze will ich schon im ganzen haben, allerdings nach den Werten sortiert, die ich vorgebe.

    Ich werde mal ein wenig rumprobieren und wenn ich was fertiges habe, ein kleines Beispiel anhängen und ihr könnt ja noch mal drüber schauen, ob das so brauchbar ist. Danke schonmal :)
    @BlueLagoonX Es würde auch genügen, wenn Du ein Dictionary(Of DEIN_ENUM, INT_RichtigeReihenfolge) oder so hinterlegst und dann in der Compare-Routine von beiden Keys die Values holst und die vergleichst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    BlueLagoonX schrieb:

    @ErfinderDesRades Auch wenn es gerade nach einer Gruppierung aussieht, es ist keine. Die Datensätze will ich schon im ganzen haben, allerdings nach den Werten sortiert, die ich vorgebe.
    Jo ich weiss.
    Um genau zusein:
    Ich würde das erst gruppieren, und dann die Gruppierung wieder "plattklopfen", und dabei die Gruppen in die gewünschte Reihenfolge bringen.