了解 LINQ 对自定义对象的独特方法限制
LINQ 的 Distinct()
方法在与自定义对象一起使用时可能是不可预测的。 默认行为依赖于对象引用相等性,而不是其属性的相等性。 这意味着具有相同属性值的两个不同对象仍将被 Distinct()
.
要克服此限制,您需要定义自定义对象如何确定相等性。常见的解决方案是实现 IEquatable<T>
接口。
实现 IEquatable
让我们用一个 Author
类来说明这一点:
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() { unchecked // Overflow is fine, just wrap { int hash = (FirstName != null ? FirstName.GetHashCode() : 0); hash = (hash * 397) ^ (LastName != null ? LastName.GetHashCode() : 0); return hash; } } }
此实现定义了平等:
Equals(Author other)
: 此方法比较两个 FirstName
对象的 LastName
和 Author
属性。 如果两个属性相等,则返回 true
,否则返回 false
。 为了稳健性,包含空检查。
GetHashCode()
: 此方法根据 FirstName
和 LastName
属性生成哈希代码。 一致的哈希码对于高效的 Distinct()
操作至关重要。 unchecked
关键字和素数乘法改善了哈希码分布。
通过正确实现 Equals()
和 GetHashCode()
,可以确保 Distinct()
将具有相同属性值的对象视为相等,从而提供预期的结果。
以上是为什么 LINQ 的 Distinct 对于自定义对象不能按预期工作?的详细内容。更多信息请关注PHP中文网其他相关文章!