Comprendre les limitations distinctes des méthodes LINQ avec les objets personnalisés
La méthodeLINQ Distinct()
peut être imprévisible lorsqu'elle est utilisée avec des objets personnalisés. Le comportement par défaut repose sur l'égalité des références d'objet, et non sur l'égalité de leurs propriétés. Cela signifie que deux objets distincts avec des valeurs de propriété identiques seront toujours considérés comme uniques par Distinct()
.
Pour surmonter cette limitation, vous devez définir comment vos objets personnalisés déterminent l'égalité. Une solution courante consiste à implémenter l'interface IEquatable<T>
.
Implémentation d'IEquatable
Illustrons cela avec un Author
cours :
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; } } }
Cette implémentation définit l'égalité :
Equals(Author other)
: Cette méthode compare les propriétés FirstName
et LastName
de deux Author
objets. Il renvoie true
si les deux propriétés sont égales, et false
sinon. Des vérifications nulles sont incluses pour plus de robustesse.
GetHashCode()
: Cette méthode génère un code de hachage basé sur les propriétés FirstName
et LastName
. Un code de hachage cohérent est crucial pour un fonctionnement Distinct()
efficace. Le mot-clé unchecked
et la multiplication de nombres premiers améliorent la distribution des codes de hachage.
En implémentant Equals()
et GetHashCode()
correctement, vous vous assurez que Distinct()
considère les objets avec les mêmes valeurs de propriété comme égaux, fournissant les résultats attendus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!