C# Listbox sortieren

  • C#

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

    C# Listbox sortieren

    Hallo,
    ich programmiere das Spiel TicTacToe, der Spieler spielt gegen den Computer.
    Je nachdem wer gewinnt wird diese Zeile in verschiedenen Methoden in meine Listbox hinzugefügt.

    Quellcode

    1. Spielstand.Items.Add("Spieler " + SpielerZähler + " : " + ComputerZähler + " Computer");

    Spielstand ist dabei meine Listbox.
    Jetzt würde ich das gerne sortieren lassen, sobald man auf einen Button klickt, dass der neuste Wert z.b. oben steht. Dies alles über eine Schnittstelle mit IComparable. Leider finde ich nicht raus wie das geht. Könnt ihr mir helfen?
    erstelle eine Klasse "Ergebnis", die die die Information (Punktezahl Gewinner+Verliere, deren Namen und das Datum wann das Spiel ausgetragen wurde) enthält. Die Klasse hat natürlich eine ToString()-Methode, die du überschreibst - das ist dann das, was in der Listbox sichtbar ist.
    Weiterhin schreibst du einen Comparer für die Ergebnis-Klasse. Diesem Comparer kannst du im Konstruktor z.B. per Enum mitliefern wonach er sortieren soll (@ErfinderDesRades das meintest du sicher nicht mit "nur eine Sortier-Möglichkeit" oder?). Die Methode die der Comparer fordert muss einen Integer zurückgeben, willst du nach Punktezahl sortieren reicht ein "return A.PunkteGewinner - B.PunkteGewinner", bei sortieren nach dem Datum kannst du die fertige Methode benutzen: "return Date.Compare(A.datum,B.datum)", für String gibts auch sowas.

    Das wars eigentlich schon. Am besten du fügst die Ergebnisse in einer "List(of Ergebnis)" zusammen. Mittels Liste.sort(new ErgebnisComparer(eSortierungNach.PunkteGewinner)) könntest du diese sortieren und per Listbox1.Datasource einer Listbox hinzufügen (setze .DataSource zuerst auf Nothing, sonst "ändert" sich für die Listbox nichts und sie aktualisiert sich nicht). Anzeigen tut die Listbox immer das richtige, du erinnerst dich ja daran die toString-Methode überschrieben zu haben.



    okay - jetzt weiß ich was der ErfinderDesRades mit "nur eine Sortier-Möglichkeit" meinte... xD Du könntest was mit einer statischen Variable (die angibt wonach sortiert werden soll, wäre ja dann für alle Objekte des Typs Ergebnis gleich und würde so das sortieren "gleichmäßig" beeinflussen können) deichseln, aber schön ist das nicht. Das IComparer-Interface wäre hier einfach besser geeignet.

    Das Ergebnis musst du so oder so in einer Klasse kapseln - denn nur so kannst du einem Ergebnis ein Datum zuordnen. Dieses Datum kannst du dann in der CompareTo-Methode benutzen um zu vergleichen.

    lg

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

    elle79 schrieb:

    wenn ich z.b. das IComparer Interface machen würde?
    So etwa:

    VB.NET-Quellcode

    1. Public Class MyComparer
    2. Implements IComparer(Of DateTime)
    3. Private _invers As Boolean
    4. Public Sub New()
    5. _invers = False
    6. End Sub
    7. Public Sub New(invers As Boolean)
    8. _invers = invers
    9. End Sub
    10. Public Function Compare(ByVal x As DateTime, ByVal y As DateTime) As Integer Implements System.Collections.Generic.IComparer(Of DateTime).Compare
    11. If _invers Then
    12. Return DateTime.Compare(x, y)
    13. Else
    14. Return DateTime.Compare(y, x)
    15. End If
    16. End Function
    17. End Class
    aufrufen z.B. so:

    VB.NET-Quellcode

    1. Array.Sort(daten, New MyComparer(True)
    2. ' oder
    3. Array.Sort(daten, New MyComparer(False)
    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!
    Wobei ich hier wieder anmerke:
    Schreibe dir eine Klasse, die dein Ergebnis kapselt. Diese Klasse sollte die Eigenschaft (Property/Variable) "Datum as Date" haben. Dann kannst du dir den Comparer - siehe RodFromGermany - für deine Ergebnis-Klasse schreiben, der jeweils die Datums-Werte vergleicht.
    Wie Rod schon angedeutet hat kannst du den Comparer in seinem Verhalten einflussen - inverse bedeutet in dem Fall, dass entweder aufsteigend oder absteigend sortiert wird. Durch übergeben einer entsprechenden Enum könntest du ihn auch dazu bringen nach Punktezahl oder Spielernamen zu sortieren.
    ich glaub ja nicht, dass ihr elle79 iwie gross was erklären könnt. Kenntnisse und Interesse bestehen eiglich keine - Es ist nur eine leidige Pflicht-Aufgabe, die hinter sich zu bringen ist.

    Ich meine das ganz ohne Vorwurf: Es ist jedermanns Recht, sich nicht für Proggen zu interessieren.
    Aber ist bischen Dilemma: Erklären kann nicht fruchten, und Vorsagen führt dazu, dass iwann einer mehr im Arbeitsleben rumspringt, mit einer Bescheinigung über Programmierfähigkeiten, die er nicht hat.
    So nach mehreren Versuchen habe ich es nun ganz von allein hinbekommen. Mit dem Code von RodFromGermany konnte ich leider nichts anfangen. Ich programmiere irgendwie ohne "Sub" und "End". Vielleicht muss ich mich noch nicht ganz aufgeben.

    elle79 schrieb:

    konnte ich leider nichts anfangen.
    Verzeih, dass ich Dich hier mit schnödem VB-Code gelangweilt habe. Solch solltest Du allerdings erkennen.

    C#-Quellcode

    1. public class MyComparer : IComparer<DateTime>
    2. {
    3. private bool _invers;
    4. public MyComparer()
    5. {
    6. _invers = false;
    7. }
    8. public MyComparer(bool invers)
    9. {
    10. _invers = invers;
    11. }
    12. public int Compare(DateTime x, DateTime y)
    13. {
    14. if (_invers)
    15. {
    16. return DateTime.Compare(x, y);
    17. }
    18. else
    19. {
    20. return DateTime.Compare(y, x);
    21. }
    22. }
    23. }
    Aufrufen z.B. so:

    C#-Quellcode

    1. Array.Sort(daten, new MyComparer(true));
    2. // oder
    3. Array.Sort(daten, new MyComparer(false));
    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!