List<T> mit Klassenobjekten nach Wert von int-Member sortiern



  • Hallo,

    ich habe eine List<T>, in der sich mehrere Klassenobjekte befinden. Die Klassenobjekte haben einen Member vom Typ integer, welcher eine ID darstellt. Nun möchte ich die Objekte nach dem Wert der ID sortieren.

    Was ich bisher probiert habe ist folgendes (hat alles nicht zu gewünschten Erfolg geführt):

    Liste.OrderBy(ZGSClient => Klassenobjekt.ID).ToList();
    
    Liste.Sort(delegate(Klassenobjekt x, Klassenobjekt y) { return (x.ID.CompareTo(y.ID )); });
    
    Liste.Sort(delegate(Klassenobjekt x, Klassenobjekt y) { return (x.ID > y.ID ? (x.ID) : (y.ID)); });
    
    Liste.Sort(delegate(Klassenobjekt x, Klassenobjekt y) { return (Math.Max(x.ID, y.ID)); });
    

    Die Objekte sind leider nachher teilweise in einer anderen Sortierung, jedoch nicht in der gewünschten.

    Wie müsste es korrekterweise gehen?



  • Dein OrderBy() ist nicht korrekt.

    Liste = Liste.OrderBy(x => x.ID).ToList(); // Funktioniert, wichtig ist die erneute Zuweisung
    Liste.Sort(delegate(Klassenobjekt x, Klassenobjekt y) { return x.ID.CompareTo(y.ID); }); // Funktioniert, sortiert intern
    

    Und guck mal hier:
    http://ideone.com/tFjqBV



  • Liste = Liste.OrderBy(x => x.ID).ToList();
    

    funktioniert bei mir leider nicht. Die Reihenfolge ist weiterhin nicht richtig, auch mit erneuter Zuweisung.

    Meinst du mit "sortiert intern", dass keine erneute Zuweisung erforderlich ist?



  • zu 1) am besten zeigst du mal ein Minimalbeispiel deines Codes, damit man den Fehler besser nachvollziehen kann
    zu 2) Ja, Sort() sortiert die Liste ohne das eine weitere Zuweisung notwendig ist.



  • Ich erzeuge eine List<T>:

    List<ZGSClient> Liste = new List<Klassenobjekt>();
    

    Dann füge ich die Klassenobjekte in die Liste ein (in einem Treeview, per drag&drop):

    Liste.Add(einKlassenobjekt);
    

    Nach jedem Einfügevorgang soll die Liste sortiert werden:

    Liste = Liste.OrderBy(Klassenobjekt => Klassenobjekt.ID).ToList();
    

    Mehr passiert mit der Liste nicht.



  • FP_05 schrieb:

    List<ZGSClient> Liste = new List<Klassenobjekt>();
    

    [...]

    ZGSClient vs. Klassenobjekt <- Was denn nun? Ist in der Liste "ZGSClient" oder "Klassenobjekt"?

    Kannst du bitte ein lauffähiges Minimalbeispiel deines Codes posten?



  • FP_05 schrieb:

    List<ZGSClient> Liste = new List<Klassenobjekt>();
    

    Muss natürlich

    List<Klassenobjekt> Liste = new List<Klassenobjekt>();
    

    heißen.



  • Lauffähiges Beispiel wäre im Grunde das, was du oben verlinkt hast. Das Drumherum ist bei mir nicht so einfach zu trennen, da es sich bei den Objekten um TCP-Clients handelt, die sich in der Applikation einloggen und dann in die Liste eingefügt werden.


  • Administrator

    Kann es sein, dass sich diese ID während der Sortierung verändert?

    Grüssli



  • Nein, die ID wird erzeugt, wenn die Objekte erzeugt werden und danach nicht mehr verändert.

    Beispiel-IDs sind: 8940225 und 8556897, das sollte OrderBy doch hinbekommen, solche Nummern zu sortieren.



  • Ohne das alles lesen zu müssen... Such mal bei NuGet nach "OrderBy". Installier die Erweiterung mal(es erscheint ein neuer Ordner in deinem Projekt) und dann nutzt du das OrderBy. Funktioniert bei uns super gut



  • secondsun schrieb:

    Ohne das alles lesen zu müssen... Such mal bei NuGet nach "OrderBy". Installier die Erweiterung mal(es erscheint ein neuer Ordner in deinem Projekt) und dann nutzt du das OrderBy. Funktioniert bei uns super gut

    Was issen das bitte fuer ne Loesung?"Hey geht das eine nicht, installier einfach was anderes und such nicht nach dem eigentlichen Fehler" Klassische Symptombehebung, was totaler Quatsch ist.

    @FP_05: Es scheint mir und den anderen so als wenn du irgend einen Zwischenschritt machst sodass die unterschiedlichen Ergebnisse vorkommen.
    Ich bitte dich, mal ein Beispiel zu bauen, wo man die IDs sieht, das Einfuegen in die Liste, das sortieren und die Ausgabe mit den faelschlicher Weise unkorrekt Sortierten Ergebnissen. Alles andere ist nur Spekuliererei und das hilft niemanden.



  • Danke für eure Hilfestellung.
    Ich habe die ID-Nummern jetzt vereinfacht (100001, 100002, usw). Damit kommt OrderBy() klar und sortiert alles korrekt.


  • Administrator

    FP_05 schrieb:

    Danke für eure Hilfestellung.
    Ich habe die ID-Nummern jetzt vereinfacht (100001, 100002, usw). Damit kommt OrderBy() klar und sortiert alles korrekt.

    Wir können immer noch nur Vermutungen anstellen. Das klingt auf mich nun z.B. so, als ob ID ein String wäre, in welchem ein Integer als String gespeichert ist. Wodurch es zwar korrekt sortiert hat, nur nicht so, wie du es erwartest 🙂

    Grüssli


Log in to reply