Utilisez IEquatable pour gérer l'égalité des objets dans LINQ Distinct
La méthode Distinct
de LINQ est conçue pour identifier des objets uniques en fonction de leur égalité. Cependant, avec les objets personnalisés, cela ne fonctionne pas toujours comme prévu.
Dans l'exemple fourni, la méthode Distinct
n'a pas réussi à identifier deux objets Author
portant le même nom comme doublons. En effet, LINQ traite les objets comme distincts en fonction de leurs adresses de référence plutôt que de leurs valeurs de propriété.
Afin de résoudre ce problème, l'interface Author
peut être implémentée dans la classe IEquatable
. En remplaçant la méthode Equals
, vous pouvez définir une logique personnalisée pour déterminer l'égalité en fonction des valeurs de propriété FirstName
et LastName
. L'implémentation suivante vérifie les valeurs correspondantes dans deux champs pour déterminer l'égalité :
<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>
Utilisation :
L'application de cette implémentation personnalisée résout le problème de Distinct
. Le code modifié identifie correctement les Author
objets en double et supprime l'un d'entre eux des résultats :
<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>
Conclusion :
L'implémentation de IEquatable
et le remplacement de la méthode Equals
permettent de personnaliser la définition de l'égalité des objets dans les opérations LINQ. Cela garantit que les méthodes Distinct
gèrent correctement les objets personnalisés en fonction de leurs propriétés plutôt que des adresses de référence.
Notez que la méthode GetHashCode
a été améliorée dans l'exemple de code pour garantir la cohérence avec la méthode Equals
et utilise l'opérateur conditionnel nul (?.) pour gérer les propriétés potentiellement nulles. Cela évite les NullReferenceException
exceptions potentielles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!