Maison >développement back-end >C++ >Pourquoi LINQ Distinct() ne fonctionne-t-il pas comme prévu avec les objets personnalisés ?

Pourquoi LINQ Distinct() ne fonctionne-t-il pas comme prévu avec les objets personnalisés ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-20 19:28:10722parcourir

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

Comportement anormal de la méthode LINQ Distinct() dans les objets personnalisés

Lors de l'utilisation de LINQ to Objects, la méthode Distinct() peut ne pas toujours produire les résultats attendus lorsque vous travaillez avec des objets personnalisés. Par défaut, LINQ considère uniquement les références pour les comparaisons d'unicité.

Dans l'exemple de code fourni, vous disposez d'une liste d'objets Book, dont chacun contient une liste d'objets Author. Lorsque vous utilisez SelectMany() pour aplatir la collection Authors en une seule liste, puis que vous appelez Distinct() , vous vous attendez à ce qu'il renvoie uniquement l'auteur unique. Cependant, vous constatez que le même auteur (Jon Skeet) apparaît deux fois.

Le problème est que les méthodes Distinct() de LINQ fonctionnent par défaut sur les références d'objet. Puisqu'il y a deux objets Author distincts dans votre liste, LINQ les considérera comme différents même s'ils ont la même valeur. Pour surmonter ce problème, vous devez fournir une implémentation d’égalité personnalisée qui définit clairement la manière dont les objets sont comparés en termes d’unicité.

Remplacer la méthode Equals

Comme suggéré dans votre question, vous pouvez remplacer la méthode Author dans la classe Equals() pour spécifier des conditions d'égalité. Cependant, votre implémentation actuelle renvoie toujours true, ce qui donne l'impression que tous les auteurs sont égaux.

Implémenter l'interface IEquatable

Une approche plus appropriée consiste à implémenter l'interface IEquatable<Author> dans votre classe. Cette interface vous permet de définir des comparateurs d'égalité personnalisés. Dans votre cas vous pouvez comparer en fonction du nom de l'auteur :

<code class="language-csharp">public class Author : IEquatable<Author>
{
    public bool Equals(Author other)
    {
        return FirstName == other.FirstName && LastName == other.LastName;
    }
}</code>

Réutiliser l'auteur dans les requêtes LINQ

Après avoir implémenté IEquatable<Author>, vous pouvez l'utiliser pour améliorer le comportement de la méthode Distinct(). Modifiez votre requête LINQ comme suit :

<code class="language-csharp">var temp = books.SelectMany(book => book.Authors).DistinctBy(a => new { a.FirstName, a.LastName });</code>

En définissant des tuples de DistinctBy() et FirstName à l'aide de LastName et d'une expression lambda personnalisée, vous pouvez spécifier explicitement comment les auteurs sont comparés en termes d'unicité.

En suivant ces étapes, vous pouvez vous assurer que la méthode Distinct() identifie et élimine correctement les auteurs en double tout en préservant leurs valeurs.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn