IComparer und Compare - Kaskadierende Sortierung

  • VB.NET

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

    IComparer und Compare - Kaskadierende Sortierung

    Hallo Euch allen,

    seit längerer Zeit versuche ich schon, "Herr" des Comparers, bzw. IComparer zu werden.


    Bei zwei Sortierkriterien ist das für mich (dank eines Programmbeispiels) auch noch kein Problem, wohl aber bei mehreren.
    Die folgenden Daten bekomme ich zur Auswertung geschickt:

    [line] Input-Daten [/line]

    Tag ID;Timestamp;Direction;Card Number;First Name;Lastname;Company


    E00401005X893866;03.01.2010 06:59;IN;226;Hugendubel;Hugo;Firma1
    E00401005X890G39;28.01.2010 06:59;IN;263;Hessi;James;Firma2
    E00401005X893866;03.01.2010 16:59;OUT;226;Hugendubel;Hugo;Firma1

    E00401005X890G39;28.01.2010 10:55;OUT;263;Hessi;James;Firma2





    Diese Daten würde ich gerne sortiert anzeigen lassen, wobei folgende kaskadierende Sortierung vorzunehmen ist:
    • TagID
    • CardNumber
    • Company
    • LastName
    • FirstName
    • Direction
    • TimeStamp

    Bisher ist mir nur eine Sortierung nach der TagID und dem TimeStamp gelungen, wozu ich mich eines Beispielprogramms bedient habe.

    [line]Beispielprogramm (s. Dateianhang howto_net_custom_sort_array-2Kriterien.zip)[/line]

    Leider stockt es schon bei meinem Versuch, die Daten nur um die Direction (d.h. "IN" oder "OUT") sortieren zu lassen.
    Füge ich dieses Datum ein, dann erhalte ich keine Ausgabe in der ListBox (s. Dateianhang howto_net_custom_sort_array-3Kriterien_Fehler.zip).

    Eine Lösung ist zwar schön und gut, aber wenn mir jemand die entscheidenden Details bei der Ergänzung der Daten um ein weiteres Datum erklären könnte, wäre mir sehr geholfen.
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „R 100 GS-PD“ () aus folgendem Grund: Code entfernt, da in angehängter Datei einsehbar

    Wäre schön wenn du den Code noch ordentlich formatieren könntest. Falls dies nicht funktioniert bzw. beim Absenden immer wieder so einen Brainfuck draus gemacht wird, kannst du oben beim Texteditor zwischen Editor und Quellcode umschalten. Nun einfach Quellcode gehen und dort den Code erneut einfügen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Willkommen im Forum. :thumbup:
    Wenn Du nach mehreren Kriterien sortieren lassen willst, musst Du zuerst die Sortierung für das 1. Kriterium durchführen.
    Danach führst Du mit dem entsprechenden Subset (gleicher 1. Wert) eine Sortierung nach dem 2. Kriterium durch.
    Danach führst Du mit dem entsprechenden Subset (gleicher 1. Wert, gleicher 2. Wert) eine Sortierung nach dem 3. Kriterium durch.
    Usw.
    Für solch komplexe Sortiervorgänge ist der "einfache" Comparer nicht gemacht.
    Du musst einfach einen komplexen IComparer erstellen, der in der richtigen Reihenfolge die einzelnen Sortierungen vornimmt.
    Bei gleichem 1. Parameter Sortierung nach dem 2.,
    bei gleichem 1. und 2. Parameter Sortierung nach dem 3. usw.
    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!

    RodFromGermany schrieb:

    Wenn Du nach mehreren Kriterien sortieren lassen willst, musst Du zuerst die Sortierung für das 1. Kriterium durchführen.
    Danach führst Du mit dem entsprechenden Subset (gleicher 1. Wert) eine Sortierung nach dem 2. Kriterium durch.
    Danach führst Du mit dem entsprechenden Subset (gleicher 1. Wert, gleicher 2. Wert) eine Sortierung nach dem 3. Kriterium durch.
    Hallo Rod,

    vielen Dank für die Antwort. Die theoretische Vorgehensweise ist mir klar, jedoch die Programmierung nicht, da ich den IComparer noch nicht richtig verstanden habe.
    Ich stelle mir eine Verschachtelung von FOR-NEXT-Schleifen vor, bin mir aber nicht sicher, ob dieser Weg korrekt ist:

    VB.NET-Quellcode

    1. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    2. Dim empx As Employee = DirectCast(x, Employee)
    3. Dim empy As Employee = DirectCast(y, Employee)
    4. Dim txtx As StringDim txty As String
    5. If TagID <> "" Then
    6. txtx = empx.TagID
    7. txty = empy.TagID
    8. If CardNo <> "" Then
    9. txtx = empx.TagID
    10. txty = empy.TagID
    11. If TimeStamp <> "" Then
    12. txtx = empx.TimeStamp
    13. txty = empy.TimeStamp
    14. End If
    15. End If
    16. End If
    17. Return String.Compare(txtx, txty)
    18. End Function


    Vielen Dank an thefiloe für den Quelltext-Hinweis.
    @R 100 GS-PD: Ungefähr so:

    VB.NET-Quellcode

    1. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    2. Dim empx As Employee = DirectCast(x, Employee)
    3. Dim empy As Employee = DirectCast(y, Employee)
    4. ' 1. Ordnung
    5. If empx.LastName <> empy.LastName Then
    6. Return String.Compare(empx.LastName, empy.LastName)
    7. End If
    8. ' 2. Ordnung
    9. If empx.FirstName <> empy.FirstName Then
    10. Return String.Compare(empx.FirstName, empy.FirstName)
    11. End If
    12. ' letzte Ordnung
    13. Return String.Compare(empx.Direction, empy.Direction)
    14. End Function
    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!
    2 Punkte:
    • Wer benutzt heutzutage denn noch die IComparer - Schnittstelle? Es gibt doch Icomparer(Of T)

    • Wer sortiert heutzutage ühaupt noch mit so Kram? Gibt doch Linq

      VB.NET-Quellcode

      1. dim SortedEmployees = From e in Employees order by e.Lastname thenby e.FirstName thenby e.Direction