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