Probleme beim Listbox-sortieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Probleme beim Listbox-sortieren

    Also ich habe eine Sub gemacht um eine ListBox zu sortieren.
    Ein Eintrag sieht z.B. so aus: 54x klaksfjkdlkafj.fkd
    und es sollte nach den zahlen sortiert weden, die größeren oben, aber hier werden die zahlen komisch verteilt...

    VB.NET-Quellcode

    1. If (ListBox1.Items.Count > 1) Then
    2. Dim TempList As New List(Of String)
    3. Dim MaxValue As Long = 0
    4. Dim MaxItem As Long = 0
    5. Dim YVal = 0
    6. For X As Long = 0 To ListBox1.Items.Count - 1
    7. For Y As Long = X To ListBox1.Items.Count - 1
    8. If Val(ListBox1.Items(Y).ToString) > MaxValue Then MaxValue = Val(ListBox1.Items(Y)) : MaxItem = Y
    9. Next
    10. TempList.Add(ListBox1.Items(MaxItem))
    11. ListBox1.Items.RemoveAt(MaxItem)
    12. MaxValue = 0
    13. MaxItem = 0
    14. Next
    15. ListBox1.DataSource = TempList
    16. End If

    Wäre dankbar falls jemand einen Fehler entdeckt.

    00yoshi schrieb:

    Ein Eintrag sieht z.B. so aus: 54x klaksfjkdlkafj.fkd
    Schreib mal ein paar mehr Einträge auf und sag genau, in welcher Reihenfolge sie nach dem sortieren stehen sollen.
    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!
    Vorraussetzung: Die Strings fangen mit Zahlen an sonst wird ne exception bei Integer.Parse() geschmissen.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private _listBoxSource As New List(Of String)
    4. Public Sub New()
    5. ' Dieser Aufruf ist für den Designer erforderlich.
    6. InitializeComponent()
    7. _listBoxSource.Add("54x klaksfjkdlkafj.fkd")
    8. _listBoxSource.Add("320xiwerjqwersdfqwe")
    9. _listBoxSource.Add("09,o919j2,2")
    10. _listBoxSource.Add("89nnr18hndnd1")
    11. SetSource()
    12. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    13. End Sub
    14. Private Sub SetSource()
    15. ListBox1.DataSource = Nothing
    16. ListBox1.DataSource = _listBoxSource
    17. End Sub
    18. Private Iterator Function GetNumber(pText As String) As IEnumerable(Of Char)
    19. For lIndex = 0 To pText.Length - 1
    20. If Char.IsNumber(pText(lIndex)) Then Yield pText(lIndex) Else Return
    21. Next
    22. End Function
    23. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    24. _listBoxSource = _listBoxSource.OrderBy(Function(item) Integer.Parse(String.Concat(GetNumber(item)))).ToList()
    25. SetSource()
    26. End Sub
    27. End Class

    @RushDen
    Für sowas kann man prima LINQ nutzen wenn es nicht so auf die Performance ankommt.
    Ist sehr praktisch. Solltest du dir mal anschauen :)

    VB.NET-Quellcode

    1. Private lSource As New List(Of String)
    2. Private r As New Regex("^\d+")
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. lSource.Add("54x klaksfjkdlkafj.fkd")
    5. lSource.Add("320xiwerjqwersdfqwe")
    6. lSource.Add("09,o919j2,2")
    7. lSource.Add("89nnr18hndnd1")
    8. ListBox1.DataSource = (From s As String In lSource Select s Order By Integer.Parse(r.Match(s).Value)).ToList()
    9. End Sub

    00yoshi schrieb:

    wird zu:
    und wie soll es?
    Es gibt eine numerische und eine alphabetische Sortierung.
    "10" < "4"
    aber
    10 > 4
    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!
    @00yoshi Dann musst Du etwas mehr Aufwand treiben.
    Pack die Original-Daten in ein String-Array. Pack die kommunizierenden numerischen Werte in ein Integer-Array. Sortiere beide nach dem Integer Array und übergib das sortierte Array per Items.AddRange().

    VB.NET-Quellcode

    1. Dim ss() = {"4x kdid.dk", "3x kdk.k", "10x klddd.dl"}
    2. Dim ii() = {4, 3, 10}
    3. Array.Sort(ii, ss)
    4. 'Array.Reverse(ss) ' ggf. Reihenfolge umkehren
    Bilder
    • Sort.jpg

      12,93 kB, 441×132, 194 mal angesehen
    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!