Heim >Backend-Entwicklung >C++ >Wie kann die korrekte Objektgleichheit für die Distinct-Methode von LINQ mit benutzerdefinierten Objekten sichergestellt werden?

Wie kann die korrekte Objektgleichheit für die Distinct-Methode von LINQ mit benutzerdefinierten Objekten sichergestellt werden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-20 19:41:14436Durchsuche

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

Verwenden Sie IEquatable, um die Objektgleichheit in LINQ Distinct zu handhaben

LINQs Distinct-Methode dient dazu, eindeutige Objekte anhand ihrer Gleichheit zu identifizieren. Bei benutzerdefinierten Objekten funktioniert es jedoch möglicherweise nicht immer wie erwartet.

Im bereitgestellten Beispiel konnte die Distinct-Methode zwei Author-Objekte mit demselben Namen nicht als Duplikate identifizieren. Dies liegt daran, dass LINQ Objekte anhand ihrer Referenzadressen und nicht anhand ihrer Eigenschaftswerte als unterschiedlich behandelt.

Um dieses Problem zu lösen, kann die Author-Schnittstelle in der IEquatable-Klasse implementiert werden. Durch Überschreiben der Equals-Methode können Sie eine benutzerdefinierte Logik definieren, um die Gleichheit basierend auf den Eigenschaftswerten FirstName und LastName zu bestimmen. Die folgende Implementierung prüft übereinstimmende Werte in zwei Feldern, um die Gleichheit festzustellen:

<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>

Verwendung:

Die Anwendung dieser benutzerdefinierten Implementierung löst das Problem von Distinct. Der geänderte Code identifiziert doppelte Author-Objekte korrekt und entfernt eines davon aus den Ergebnissen:

<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>

Fazit:

Durch die Implementierung von IEquatable und das Überschreiben der Equals-Methode können Sie die Definition der Objektgleichheit in LINQ-Operationen anpassen. Dadurch wird sichergestellt, dass Distinct-Methoden benutzerdefinierte Objekte basierend auf ihren Eigenschaften und nicht anhand von Referenzadressen korrekt verarbeiten.

Beachten Sie, dass die GetHashCode-Methode im Codebeispiel verbessert wurde, um Konsistenz mit der Equals-Methode sicherzustellen und den Null-Bedingungsoperator (?.) verwendet, um potenziell Null-Eigenschaften zu verarbeiten. Dies vermeidet potenzielle NullReferenceException Ausnahmen.

Das obige ist der detaillierte Inhalt vonWie kann die korrekte Objektgleichheit für die Distinct-Methode von LINQ mit benutzerdefinierten Objekten sichergestellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn