Gunakan IEquatable untuk mengendalikan kesamaan objek dalam LINQ Distinct
KaedahLINQ 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>
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>
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!