Rumah > pembangunan bahagian belakang > C++ > Mengapa LINQ Distinct() Tidak Berfungsi Seperti Yang Dijangkakan dengan Objek Tersuai?

Mengapa LINQ Distinct() Tidak Berfungsi Seperti Yang Dijangkakan dengan Objek Tersuai?

Susan Sarandon
Lepaskan: 2025-01-20 19:28:10
asal
717 orang telah melayarinya

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

Tingkah laku abnormal kaedah LINQ Distinct() dalam objek tersuai

Apabila menggunakan LINQ ke Objek, kaedah Distinct() mungkin tidak selalu menghasilkan hasil yang diharapkan apabila bekerja dengan objek tersuai. Secara lalai, LINQ hanya mempertimbangkan rujukan untuk perbandingan keunikan.

Dalam contoh kod yang disediakan, anda mempunyai senarai Book objek, setiap satunya mengandungi senarai Author objek. Apabila anda menggunakan SelectMany() untuk meratakan koleksi Authors ke dalam satu senarai, dan kemudian memanggil Distinct() , anda menjangkakan ia akan mengembalikan pengarang unik sahaja. Walau bagaimanapun, anda perhatikan bahawa pengarang yang sama (Jon Skeet) muncul dua kali.

Masalahnya ialah kaedah Distinct() dalam LINQ beroperasi pada rujukan objek secara lalai. Memandangkan terdapat dua objek Author yang berasingan dalam senarai anda, LINQ akan menganggapnya berbeza walaupun ia mempunyai nilai yang sama. Untuk mengatasi masalah ini, anda perlu menyediakan pelaksanaan kesaksamaan tersuai yang mentakrifkan dengan jelas cara objek dibandingkan untuk keunikan.

Timpa kaedah Equals

Seperti yang dicadangkan dalam soalan anda, anda boleh mengatasi kaedah Author dalam kelas Equals() untuk menentukan syarat kesamaan. Walau bagaimanapun, pelaksanaan semasa anda sentiasa mengembalikan true, menjadikan semua pengarang kelihatan sama.

Laksanakan antara muka Iequatable

Pendekatan yang lebih sesuai ialah melaksanakan antara muka IEquatable<Author> dalam kelas anda. Antara muka ini membolehkan anda menentukan pembanding kesaksamaan tersuai. Dalam kes anda, anda boleh membandingkan berdasarkan nama pengarang:

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

Gunakan semula pengarang dalam pertanyaan LINQ

Selepas melaksanakan IEquatable<Author>, anda boleh menggunakannya untuk memperbaiki tingkah laku kaedah Distinct(). Ubah suai pertanyaan LINQ anda seperti berikut:

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

Dengan mentakrifkan tupel DistinctBy() dan FirstName menggunakan LastName dan ungkapan lambda tersuai, anda boleh menentukan secara eksplisit cara pengarang dibandingkan untuk keunikan.

Dengan mengikut langkah ini, anda boleh memastikan kaedah Distinct() mengenal pasti dan menghapuskan pengarang pendua dengan betul sambil mengekalkan nilai mereka.

Atas ialah kandungan terperinci Mengapa LINQ Distinct() Tidak Berfungsi Seperti Yang Dijangkakan 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