Mehrdimensionales array sortieren

  • VB.NET

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

    Mehrdimensionales array sortieren

    Hallo,

    ErfinderDesRades hat im letzten Jahr eine gute Lösung zur Frage nach "[VB 2010] Mehrdimensionales array erstellen und sortieren" im Thread
    [VB 2010] Mehrdimensionales array erstellen und sortieren
    gegeben.

    Die Funktion

    VB.NET-Quellcode

    1. IndexList.Sort(Function(x, y) x.Feld01.CompareTo(y.Feld01))
    sortiert aber "nur" nach dem ersten Feld (aufsteigend).

    Mein Problem ist, dass ich zusätzlich das Feld02 absteigend(!) sortieren muss. Also gleicher Inhalt im Feld01 bedeutet, dass das Feld02 absteigend sortiert sein muss.
    In einer sich anschliessenden Funktion muss ich die Dubletten "Feld01" aussortieren.

    Ich hoffe mein Problem ist verständlich ausgedrückt :)

    Einen schönen Sonntag
    HaRo
    Willkommen im Forum. :thumbup:
    Dann solltest Du nach der Sortierung des 1. Parameters eine weitere Funktion aufrufen, die Du mit den Dubletten fütterst und sie nach dem 2. Parameter sortieren lässt.
    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!
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt

    Danke Rod :)

    Naja, Du hast mein Problem anders umschrieben. Ich weiß halt nicht wie das gehen kann.
    Was die Dublette ist, entscheidet sich ja auch erst nach der geschachtelten Sortierung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    HaRoWagner schrieb:

    entscheidet sich ja auch erst nach der geschachtelten Sortierung.
    Korrekt.
    Du gehst nach der Sortierung die 1. Spalte durch und testest auf Dubletten. Dann rufst Du den 2. Sorter auf und übergibst im den Index-Bereich der jeweiligen Dubletten.
    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!
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt

    Hmm, danke für Deine Antwort. Eine schlanke Funktion gibt es also nicht dafür. Hätte ja auch mal klappen können :D

    War ich wenigstens nicht auf dem Holzweg. Einen schönen Sonntag noch weiterhin.

    HaRo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Türlich gibts dafür eine schlanke Lösung

    VB.NET-Quellcode

    1. IndexList.Sort(Function(x, y)
    2. Dim cmp = x.Feld01.CompareTo(y.Feld01)
    3. If cmp = 0 Then Return y.Feld02.CompareTo(x.Feld02)
    4. Return cmp
    5. End Function)

    na schön, dassis ohne Doubletten aussortieren, aber letzteres ist halt einfach eine annere Baustelle.
    Hallo ErfinderDesRades.

    Wow, was für eine Funktion.
    Ich hatte die umständliche Variante schon fertig und auch getestet. Die von Dir beschriebene Funktion habe ich jetzt auch getestet und bisher keinen einzigen Sortierunterschied festgesellt.

    Ich frage mich nur, wieso die Funktion klappt, also wie kommt es, dass Feld02 tatsächlich absteigend sortiert wird. Liegt es allein daran, dass Du die Vergleichsoperation umgedreht hast?
    Also y mit x vergleichst statt umgekehrt?

    Sieht so einfach aus, wie es da steht, aber da steckt viel Hirnschmalz drinnen. Danke für die Hilfe.
    Das Aussortieren ist jedenfalls auch gleich leichter so, der gesamt Code schmilzt von kapp über 50 Zeilen jetzt auf 15 Zeilen zusammen :thumbsup:

    Danke Dir und einen schönen Restsonntag
    HaRo

    HaRoWagner schrieb:

    Ich frage mich nur, wieso die Funktion klappt, also wie kommt es, dass Feld02 tatsächlich absteigend sortiert wird. Liegt es allein daran, dass Du die Vergleichsoperation umgedreht hast?

    is richtig.

    Aber für ein tieferes Verständnis wird notwendig sein, sich die .CompareTo - Methode im ObjectBrowser anzugugge - am besten die IComparable(of T)-Schnittstelle gleich mit.