Maison > développement back-end > C++ > Comment garantir une égalité correcte des objets pour la méthode distincte de LINQ avec des objets personnalisés ?

Comment garantir une égalité correcte des objets pour la méthode distincte de LINQ avec des objets personnalisés ?

Linda Hamilton
Libérer: 2025-01-20 19:41:14
original
435 Les gens l'ont consulté

How to Ensure Correct Object Equality for LINQ's Distinct Method with Custom Objects?

Utilisez IEquatable pour gérer l'égalité des objets dans LINQ Distinct

La méthode Distinct de LINQ est conçue pour identifier des objets uniques en fonction de leur égalité. Cependant, avec les objets personnalisés, cela ne fonctionne pas toujours comme prévu.

Dans l'exemple fourni, la méthode Distinct n'a pas réussi à identifier deux objets Author portant le même nom comme doublons. En effet, LINQ traite les objets comme distincts en fonction de leurs adresses de référence plutôt que de leurs valeurs de propriété.

Afin de résoudre ce problème, l'interface Author peut être implémentée dans la classe IEquatable. En remplaçant la méthode Equals, vous pouvez définir une logique personnalisée pour déterminer l'égalité en fonction des valeurs de propriété FirstName et LastName. L'implémentation suivante vérifie les valeurs correspondantes dans deux champs pour déterminer l'égalité :

<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 (FirstName == other?.FirstName && LastName == other?.LastName)
            return true;

        return false;
    }

    // 为保持一致性而重写GetHashCode
    public override int GetHashCode()
    {
        return (FirstName?.GetHashCode() ?? 0) ^ (LastName?.GetHashCode() ?? 0);
    }
}</code>
Copier après la connexion

Utilisation :

L'application de cette implémentation personnalisée résout le problème de Distinct. Le code modifié identifie correctement les Author objets en double et supprime l'un d'entre eux des résultats :

<code class="language-csharp">using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // 使用重复作者初始化书籍列表
        List<Book> books = new List<Book>
        {
            new Book
            {
                Name = "C# in Depth",
                Authors = new List<Author>
                {
                    new Author { FirstName = "Jon", LastName = "Skeet" },
                    new Author { FirstName = "Jon", LastName = "Skeet" },
                }
            },
            // ...
        };

        // 选择作者,应用Distinct,并打印
        var temp = books.SelectMany(book => book.Authors).Distinct();
        foreach (var author in temp)
        {
            Console.WriteLine($"{author.FirstName} {author.LastName}");
        }

        Console.Read();
    }
}</code>
Copier après la connexion

Conclusion :

L'implémentation de IEquatable et le remplacement de la méthode Equals permettent de personnaliser la définition de l'égalité des objets dans les opérations LINQ. Cela garantit que les méthodes Distinct gèrent correctement les objets personnalisés en fonction de leurs propriétés plutôt que des adresses de référence.

Notez que la méthode GetHashCode a été améliorée dans l'exemple de code pour garantir la cohérence avec la méthode Equals et utilise l'opérateur conditionnel nul (?.) pour gérer les propriétés potentiellement nulles. Cela évite les NullReferenceException exceptions potentielles.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal