Maison >développement back-end >C++ >Pourquoi Distinct de LINQ ne fonctionne-t-il pas avec les objets personnalisés et comment puis-je y remédier ?
LINQ Distinct()
et objets personnalisés : un piège courant
LINQ Distinct()
simplifie la suppression des doublons des collections. Cependant, il se comporte de manière inattendue avec les objets personnalisés, ne parvenant souvent pas à identifier les doublons en fonction de leurs propriétés.
Le problème : référence ou égalité de valeurs
Le problème réside dans la manière Distinct()
de comparer les objets. Il utilise l'égalité de référence, ce qui signifie que deux objets sont considérés comme distincts à moins qu'ils n'occupent le même emplacement mémoire. Cela signifie que même si deux objets personnalisés ont des valeurs de propriété identiques, Distinct()
les traite comme des entités distinctes.
Exemple illustratif : auteurs en double
Imaginez une liste de livres, chacun avec une liste d'auteurs. Même si deux livres répertorient le même auteur (mêmes prénom et nom), Distinct()
ne supprimera pas les entrées d'auteur en double car ce sont des instances d'objet distinctes.
La solution : mise en œuvre IEquatable<T>
Pour résoudre ce problème, implémentez l'interface IEquatable<T>
dans votre classe d'objet personnalisée (par exemple, Author
). Cette interface impose les méthodes Equals()
et GetHashCode()
, vous permettant de définir comment l'égalité est déterminée pour vos objets. En remplaçant ces méthodes, vous pouvez demander à Distinct()
de comparer en fonction des valeurs de propriété plutôt que des références.
Classe Author
améliorée
Voici une classe Author
améliorée implémentant IEquatable<Author>
:
<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>
Résolution : comparaison basée sur la valeur
En implémentant IEquatable<Author>
, la méthode Equals()
compare désormais les auteurs en fonction de leur FirstName
et LastName
. La méthode GetHashCode()
garantit un hachage cohérent pour les objets ayant les mêmes valeurs. Désormais, Distinct()
identifiera et supprimera correctement les auteurs en double en fonction de leurs noms.
Conclusion : une égalité personnalisée pour Distinct()
La mise en œuvre de IEquatable<T>
fournit un mécanisme crucial pour contrôler la façon dont vos objets personnalisés sont comparés en termes d'égalité, permettant à Distinct()
de fonctionner correctement lorsqu'il s'agit de doublons basés sur des valeurs. Cela garantit que Distinct()
fonctionne comme prévu, en supprimant les doublons en fonction des propriétés que vous définissez comme significatives.
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!