Mengatasi Ketidakcekapan Kaedah Berbeza LINQ untuk Objek Tersuai
KaedahLINQ Distinct()
boleh menjadi tidak cekap apabila digunakan dengan objek tersuai. Ini kerana, secara lalai, ia bergantung pada kesamaan rujukan—bermaksud ia hanya menganggap dua objek berbeza jika ia menduduki lokasi memori yang berbeza. Objek yang sama (dengan nilai sifat yang sama) akan dianggap sebagai entiti yang berasingan, yang membawa kepada hasil pendua.
Penyelesaian terletak pada melaksanakan antara muka IEquatable<T>
dalam kelas objek tersuai anda. Ini membolehkan anda menentukan cara kesaksamaan ditentukan untuk objek anda, berdasarkan sifatnya dan bukannya alamat memorinya.
Berikut ialah pelaksana kelas Author
yang dipertingkatkan IEquatable<Author>
:
<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 (other is null) return false; return FirstName == other.FirstName && LastName == other.LastName; } public override int GetHashCode() { return HashCode.Combine(FirstName, LastName); } }</code>
Dengan mengatasi kaedah Equals()
dan melaksanakan GetHashCode()
, anda memberikan Distinct()
logik yang diperlukan untuk mengenal pasti dan mengalih keluar objek Author
pendua berdasarkan sifat FirstName
dan LastName
dengan betul. Perhatikan penggunaan HashCode.Combine
untuk penjanaan kod cincang yang lebih mantap. Ini memastikan bahawa objek yang dianggap sama oleh Equals()
juga menghasilkan kod cincang yang sama. Dengan menggunakan pendekatan ini, Distinct()
kini akan mengenal pasti dan mengalih keluar objek pengarang pendua berdasarkan namanya dengan tepat.
Atas ialah kandungan terperinci Mengapa Kaedah Distinct LINQ Tidak Cekap dengan Objek Tersuai, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!