Verständnisfrage mit .Distinct()



  • Hallo 🙂

    Die listKlasse beinhaltet 277 items.

    foreach (var item in listKlasse)
                {
                    k = new Klasse();
                    k.Name = item.Name;
                    listKlasseEinlesen.Add(m);
    
                    string str = item.Name;
                    listStringEinlesen.Add(str);
                }
    
                listStringEinlesen = listStringEinlesen.Distinct().ToList();
                listKlasseEinlesen = listKlasseEinlesen.Distinct().ToList();
    
                MessageBox.Show("string: " + listStringEinlesen.Count.ToString() + "   Klasse: " + listKlasseEinlesen.Count.ToString());
    

    Nun meine Frage, weshalb erhalte ich nach dem .Distinct() unterschiedliche Werte für die List<string> wie für die List<Klasse>?

    Sind in der Liste strings enthalten, sind es (wie es sein soll) noch 200 items.
    Bei der Liste mit der Klasse sind es weiterhin 277 items.
    Weshalb? Was ist falsch?

    P.S.: Benennung ist schlecht, soll hier aber nur dem Beispiel dienen!



  • Was steht denn in listKlasse so drin?

    Ich benutze .Distinct() nicht wirklich, aber es könnte sein das die Neue Klasse + "item.name" zusammen jeweils eine "Einzigartige" Einheit darstellen, wohingegen der String auf sein Charset geprüft wird. Kurz und knapp, vll liegts schlicht am new.



  • Irgendwoher muss Distinct wissen, wann zwei Objekte deiner Klasse "gleich" sind. Distinct verwendet den Default-EqualityComparer, wenn du nichts anderes angibst.

    Anscheinend implementiert deine Klasse weder System.IEquatable noch überschreibt sie Equals und GetHashCode (String tut das). Damit heißt gleich einfach nur "verweist auf's selbe Objekt". Und da du nur unterschiedliche Objekte in der Liste hast, bewirkt Distinct gar nichts.



  • MFK schrieb:

    Irgendwoher muss Distinct wissen, wann zwei Objekte deiner Klasse "gleich" sind. [...]

    🙂 👍

    Ah, klasse - macht Sinn! Ich bin schon mal schlauer und hoffe dem Ersteller hilft das auch.


Anmelden zum Antworten