Heim > Backend-Entwicklung > C++ > Warum funktioniert LINQs Distinct nicht mit benutzerdefinierten Objekten und wie kann ich das Problem beheben?

Warum funktioniert LINQs Distinct nicht mit benutzerdefinierten Objekten und wie kann ich das Problem beheben?

Susan Sarandon
Freigeben: 2025-01-20 19:37:11
Original
673 Leute haben es durchsucht

Why Doesn't LINQ's Distinct Work with Custom Objects, and How Can I Fix It?

LINQs Distinct() und benutzerdefinierte Objekte: Eine häufige Gefahr

LINQs Distinct()-Methode vereinfacht das Entfernen von Duplikaten aus Sammlungen. Bei benutzerdefinierten Objekten verhält es sich jedoch unerwartet, da Duplikate häufig nicht anhand ihrer Eigenschaften identifiziert werden können.

Das Problem: Referenz vs. Wertgleichheit

Das Problem liegt darin, wie Distinct() Objekte vergleicht. Es verwendet Referenzgleichheit, was bedeutet, dass zwei Objekte als unterschiedlich betrachtet werden, es sei denn, sie belegen denselben Speicherort. Das bedeutet, dass Distinct() selbst wenn zwei benutzerdefinierte Objekte identische Eigenschaftswerte haben, sie als separate Einheiten behandelt.

Anschauliches Beispiel: Doppelte Autoren

Stellen Sie sich eine Liste von Büchern vor, jedes mit einer Liste der Autoren. Selbst wenn in zwei Büchern derselbe Autor (gleicher Vor- und Nachname) aufgeführt ist, werden die doppelten Autoreneinträge Distinct() nicht entfernt, da es sich um unterschiedliche Objektinstanzen handelt.

Die Lösung: Umsetzung IEquatable<T>

Um dieses Problem zu beheben, implementieren Sie die IEquatable<T>-Schnittstelle in Ihrer benutzerdefinierten Objektklasse (z. B. Author). Diese Schnittstelle schreibt die Methoden Equals() und GetHashCode() vor, sodass Sie definieren können, wie die Gleichheit für Ihre Objekte bestimmt wird. Durch Überschreiben dieser Methoden können Sie Distinct() anweisen, den Vergleich auf der Grundlage von Eigenschaftswerten statt auf Referenzen durchzuführen.

Erweiterte AuthorKlasse

Hier ist eine verbesserte Author-Klasse, die IEquatable<Author> implementiert:

<code class="language-csharp">public class Author : IEquatable<Author>
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public bool Equals(Author other)
    {
        if (other == null) return false;
        return FirstName == other.FirstName && LastName == other.LastName;
    }

    public override int GetHashCode()
    {
        return (FirstName?.GetHashCode() ?? 0) ^ (LastName?.GetHashCode() ?? 0);
    }
}</code>
Nach dem Login kopieren

Lösung: Wertbasierter Vergleich

Durch die Implementierung von IEquatable<Author> vergleicht die Equals()-Methode nun Autoren anhand ihrer FirstName und LastName. Die GetHashCode()-Methode gewährleistet ein konsistentes Hashing für Objekte mit denselben Werten. Jetzt identifiziert und entfernt Distinct() doppelte Autoren korrekt anhand ihrer Namen.

Fazit: Maßgeschneiderte Gleichstellung für Distinct()

Die Implementierung von IEquatable<T> bietet einen entscheidenden Mechanismus zur Steuerung, wie Ihre benutzerdefinierten Objekte auf Gleichheit verglichen werden, sodass Distinct() beim Umgang mit wertbasierten Duplikaten ordnungsgemäß funktioniert. Dadurch wird sichergestellt, dass Distinct() wie vorgesehen funktioniert und Duplikate basierend auf den von Ihnen als wichtig definierten Eigenschaften entfernt werden.

Das obige ist der detaillierte Inhalt vonWarum funktioniert LINQs Distinct nicht mit benutzerdefinierten Objekten und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage