Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memastikan Kesamaan Objek yang Betul untuk Kaedah Berbeza LINQ dengan Objek Tersuai?

Bagaimana untuk Memastikan Kesamaan Objek yang Betul untuk Kaedah Berbeza LINQ dengan Objek Tersuai?

Linda Hamilton
Lepaskan: 2025-01-20 19:41:14
asal
435 orang telah melayarinya

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

Gunakan IEquatable untuk mengendalikan kesamaan objek dalam LINQ Distinct

Kaedah

LINQ Distinct direka untuk mengenal pasti objek unik berdasarkan kesamaan mereka. Walau bagaimanapun, dengan objek tersuai, ia mungkin tidak selalu berfungsi seperti yang diharapkan.

Dalam contoh yang diberikan, kaedah Distinct gagal mengenal pasti dua Author objek dengan nama yang sama dengan pendua. Ini kerana LINQ menganggap objek sebagai berbeza berdasarkan alamat rujukannya dan bukannya nilai hartanya.

Untuk menyelesaikan masalah ini, antara muka Author boleh dilaksanakan dalam kelas IEquatable. Dengan mengatasi kaedah Equals, anda boleh menentukan logik tersuai untuk menentukan kesaksamaan berdasarkan nilai harta FirstName dan LastName. Pelaksanaan berikut menyemak nilai padanan dalam dua medan untuk menentukan kesaksamaan:

<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>
Salin selepas log masuk

Penggunaan:

Menggunakan pelaksanaan tersuai ini menyelesaikan masalah Distinct. Kod yang diubah suai dengan betul mengenal pasti objek Author pendua dan mengalih keluar salah satu daripadanya daripada hasil:

<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>
Salin selepas log masuk

Kesimpulan:

Melaksanakan IEquatable dan mengatasi kaedah Equals membolehkan menyesuaikan takrif kesamaan objek dalam operasi LINQ. Ini memastikan kaedah Distinct mengendalikan objek tersuai dengan betul berdasarkan sifatnya dan bukannya alamat rujukan.

Perhatikan bahawa kaedah GetHashCode telah dipertingkatkan dalam contoh kod untuk memastikan konsistensi dengan kaedah Equals dan menggunakan operator bersyarat nol (?.) untuk mengendalikan sifat yang berpotensi nol. Ini mengelakkan kemungkinan NullReferenceException pengecualian.

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Kesamaan Objek yang Betul untuk Kaedah Berbeza LINQ dengan Objek Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan