Heim >Backend-Entwicklung >C++ >Warum funktioniert LINQs Distinct mit benutzerdefinierten Objekten nicht wie erwartet?
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()
.
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
Lassen Sie uns dies mit einer Author
Klasse 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!