Comparer zum alphabetischem sortieren gesucht

  • VB.NET

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

    Comparer zum alphabetischem sortieren gesucht

    Hallo, ich habe ein problem und komme einfach nicht weiter...

    Ich habe eine Liste mit Filmen. Ein Film ist eine eigenst erstellte klasse die Daten wie Dateigröße, Titel, Schon angesehen etc enthält. Um die Liste zu sortieren habe ich mir mehrere Comparer geschrieben die so aussehen (hier mal das beispiel zur sortierung nach der dateigröße):

    VB.NET-Quellcode

    1. Public Class FileSizeComparer
    2. Implements IComparer(Of Movie)
    3. Public Function CompareMovieBySize(ByVal x As Movie, ByVal y As Movie) As Integer _
    4. Implements System.Collections.Generic.IComparer(Of Movie).Compare
    5. Return (y.FileSize - x.FileSize)
    6. End Function
    7. End Class


    mein problem ist der comparer zur alphabetischen sortierung. ich habe keine alternative gefunden, desshalb versuche ich das ganze von hand zu fuß zu lösen - also wenn jemand weiß wie ich eine liste mit eigenen klassen im bezug auf eine bestimmte property alphabetisch sortiere nur her damit! xD
    mein ansatz sähe so aus: einen string in einen zahlenwert zu wandeln.. da habe ich aber eben den durchblick verloren als ich versuchte das ganze mittels asciitabelle zu realisieren... kann mir bitte jemand helfen?





    EDIT: habe eine lösung gefunden die mir allerdings nicht soooo gefällt. funsen tut sie. falls jemand was besseres kennt bedanke ich mich!

    VB.NET-Quellcode

    1. Public Class TitelComparer
    2. Implements IComparer(Of Movie)
    3. Public Function CompareMovieByTitel(ByVal x As Movie, ByVal y As Movie) As Integer _
    4. Implements System.Collections.Generic.IComparer(Of Movie).Compare
    5. If x.Titel = y.Titel Then Return 0
    6. Dim a() As String = New String() {x.Titel, y.Titel}
    7. System.Array.Sort(Of String)(a)
    8. If a(0) = x.Titel Then Return 1 Else Return -1
    9. End Function
    10. End Class

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

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim a As String = "aaa"
    3. Dim b As String = "bbb"
    4. Dim flag As Boolean = a > b
    5. Dim ii As Integer = String.Compare(a, b) ' -1, 0, 1
    6. End Sub
    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!
    Einen String kannst du ebenso vergleichen wie Integer.
    if "hallo" > "gogo" then...
    Deshalb sollte auch der Comparer ebenso ausgelegt sein.
    Bsp

    VB.NET-Quellcode

    1. Public Class titlecomparer
    2. Implements IComparer(Of movie)
    3. Public Function CompareMovieByTitle(x As movie, y As movie) As Integer _
    4. Implements System.Collections.Generic.IComparer(Of movie).Compare
    5. If x.title.ToLower > x.title.ToLower Then
    6. Return -1
    7. ElseIf x.title.ToLower < x.title.ToLower Then
    8. Return 1
    9. ElseIf x.title.ToLower = x.title.ToLower Then
    10. Return 0
    11. End If
    12. End Function
    13. End Class


    [line=40%][/line]
    Musst du für deinen Programmablauf immer die gesamte Liste sortieren? Ist es nicht auch möglich auf eine generierte Reihenfolge zurückzugreifen, wie du sie mit LINQ erstellen kannst?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public movielist As New List(Of movie)
    3. Dim ListeNachDateigroesse As IEnumerable(Of movie) =
    4. From movie In movielist
    5. Order By movie.filesize Descending
    6. Select movie
    7. Dim ListeNachTitel As IEnumerable(Of movie) =
    8. From movie In movielist
    9. Order By movie.title.ToLowerInvariant
    10. Select movie
    11. Dim ListeNachTitelMit_A As IEnumerable(Of movie) =
    12. From movie In movielist
    13. Where movie.title.ToLowerInvariant.StartsWith("a")
    14. Select movie
    15. Private Sub VariantemitSortierer()
    16. movielist.Sort(deincomparer)
    17. 'Die komplette Liste ist sortiert
    18. 'Zeigt den ersten Film an, sortiert mittels 'deincomparer'
    19. MessageBox.Show(movielist(0).title)
    20. End Sub
    21. Private Sub VariantemitLINQ()
    22. 'zeigt den ersten Film an aus der dynamisch erzeugten Abfrage 'ListeNachTitel'
    23. MessageBox.Show(ListeNachTitel(0).title)
    24. 'zeigt den ersten Film sortiert nach Dateigroesse
    25. MessageBox.Show(ListeNachDateigroesse(0).title)
    26. 'zeigt den ersten Film aus der Liste 'listenachtitelmit_a'
    27. MessageBox.Show(ListeNachTitelMit_A(0).title)
    28. End Sub
    29. Private Sub zweiteVariantemitLINQ()
    30. 'Hier wird in der sortierten Rückgabe der Liste gesucht
    31. For Each item In
    32. From movie In movielist
    33. Order By movie.title.ToLowerInvariant
    34. Select movie
    35. MessageBox.Show(item.title)
    36. Next
    37. End Sub
    38. End Class
    39. Public Class movie
    40. Public filesize As Integer
    41. Public title As String
    42. End Class

    Sorry, wenn das von deinem Ansatz wegführen sollte...
    DataGridView kannst du beliebig Stylen.
    Das einfachste ist, die GridLinien zu deaktivieren, und die Zeilenhöhe verringern - dann siehts aus wie ListView.
    Aber auch die Sachen aus deiner Spezial-Listbox sind machbar, sogar mit bisserl weniger Aufwand, weil man nicht den ganzen Datensatz ownerDrawn muß, sondern nur die Zellen, die etwa diese Bewertungspunkte anzeigen sollen. Und es reagiert halt auf CellClick, da brauchst du auch keine Messungen der Mauspositionen vornehmen, wie bei deiner Listbox.
    gugge coloriertes DatagridView, noch ein coloriertes Datagridview, DgvProgressCell - nurso zur Illustration einiger Möglichkeiten.