LINQ 的 Distinct()
和自定义对象:常见陷阱
LINQ 的 Distinct()
方法简化了从集合中删除重复项的过程。 然而,它对于自定义对象的行为却出乎意料,通常无法根据其属性识别重复项。
问题:引用与值相等
问题在于Distinct()
如何比较对象。它使用引用相等,这意味着两个对象被认为是不同的,除非它们占用相同的内存位置。 这意味着即使两个自定义对象具有相同的属性值,Distinct()
也会将它们视为单独的实体。
说明性示例:重复作者
想象一个书籍列表,每本书都有一个作者列表。 即使两本书列出了相同的作者(相同的名字和姓氏),Distinct()
也不会删除重复的作者条目,因为它们是不同的对象实例。
解决方案:实施IEquatable<T>
要解决此问题,请在自定义对象类中实现 IEquatable<T>
接口(例如 Author
)。此接口强制使用 Equals()
和 GetHashCode()
方法,允许您定义如何确定对象的相等性。 通过重写这些方法,您可以指示 Distinct()
根据属性值而不是引用进行比较。
增强Author
课程
这是一个改进的 Author
类,实现 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 == null) return false; return FirstName == other.FirstName && LastName == other.LastName; } public override int GetHashCode() { return (FirstName?.GetHashCode() ?? 0) ^ (LastName?.GetHashCode() ?? 0); } }</code>
解决方案:基于价值的比较
通过实现 IEquatable<Author>
,Equals()
方法现在根据 FirstName
和 LastName
比较作者。 GetHashCode()
方法确保具有相同值的对象的一致散列。 现在,Distinct()
将根据姓名正确识别并删除重复的作者。
结论:为Distinct()
实现 IEquatable<T>
提供了一种关键机制来控制如何比较自定义对象是否相等,从而使 Distinct()
在处理基于值的重复项时能够正确运行。 这可确保 Distinct()
按预期运行,根据您定义的重要属性删除重复项。
以上是为什么 LINQ 的 Distinct 不能与自定义对象一起使用,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!