Heim >Backend-Entwicklung >C++ >Warum funktioniert LINQs Distinct mit benutzerdefinierten Objekten nicht wie erwartet?

Warum funktioniert LINQs Distinct mit benutzerdefinierten Objekten nicht wie erwartet?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-20 19:46:13707Durchsuche

Why Doesn't LINQ's Distinct Work as Expected with Custom Objects?

Verstehen der eindeutigen Methodenbeschränkungen von LINQ mit benutzerdefinierten Objekten

Die Distinct()-Methode von LINQ kann unvorhersehbar sein, wenn sie mit benutzerdefinierten Objekten verwendet wird. Das Standardverhalten basiert auf der Gleichheit der Objektreferenzen und nicht auf der Gleichheit ihrer Eigenschaften. Dies bedeutet, dass zwei unterschiedliche Objekte mit identischen Eigenschaftswerten von Distinct().

immer noch als eindeutig betrachtet werden

Um diese Einschränkung zu überwinden, müssen Sie definieren, wie Ihre benutzerdefinierten Objekte die Gleichheit bestimmen. Eine gängige Lösung ist die Implementierung der IEquatable<T>-Schnittstelle.

Implementierung von IEquatable für benutzerdefinierte Objektgleichheit

Lassen Sie uns dies mit einer AuthorKlasse veranschaulichen:

<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()
    {
        unchecked // Overflow is fine, just wrap
        {
            int hash = (FirstName != null ? FirstName.GetHashCode() : 0);
            hash = (hash * 397) ^ (LastName != null ? LastName.GetHashCode() : 0);
            return hash;
        }
    }
}</code>

Diese Implementierung definiert Gleichheit:

  • Equals(Author other): Diese Methode vergleicht die FirstName- und LastName-Eigenschaften zweier Author-Objekte. Es gibt true zurück, wenn beide Eigenschaften gleich sind, andernfalls false. Zur Gewährleistung der Robustheit sind Nullprüfungen enthalten.

  • GetHashCode(): Diese Methode generiert einen Hash-Code basierend auf den Eigenschaften FirstName und LastName. Ein konsistenter Hash-Code ist entscheidend für einen effizienten Distinct() Betrieb. Das Schlüsselwort unchecked und die Primzahlmultiplikation verbessern die Hash-Code-Verteilung.

Durch die korrekte Implementierung von Equals() und GetHashCode() stellen Sie sicher, dass Distinct() Objekte mit denselben Eigenschaftswerten als gleich betrachtet und die erwarteten Ergebnisse liefert.

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

Stellungnahme:
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