首页 >后端开发 >C++ >为什么 LINQ 的 Distinct 对于自定义对象不能按预期工作?

为什么 LINQ 的 Distinct 对于自定义对象不能按预期工作?

Patricia Arquette
Patricia Arquette原创
2025-01-20 19:46:13779浏览

Why Doesn't LINQ's Distinct Work as Expected with Custom Objects?

了解 LINQ 对自定义对象的独特方法限制

LINQ 的 Distinct() 方法在与自定义对象一起使用时可能是不可预测的。 默认行为依赖于对象引用相等性,而不是其属性的相等性。 这意味着具有相同属性值的两个不同对象仍将被 Distinct().

视为唯一

要克服此限制,您需要定义自定义对象如何确定相等性。常见的解决方案是实现 IEquatable<T> 接口。

实现 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()
    {
        unchecked // Overflow is fine, just wrap
        {
            int hash = (FirstName != null ? FirstName.GetHashCode() : 0);
            hash = (hash * 397) ^ (LastName != null ? LastName.GetHashCode() : 0);
            return hash;
        }
    }
}</code>

此实现定义了平等:

  • Equals(Author other): 此方法比较两个 FirstName 对象的 LastNameAuthor 属性。 如果两个属性相等,则返回 true,否则返回 false。 为了稳健性,包含空检查。

  • GetHashCode(): 此方法根据 FirstNameLastName 属性生成哈希代码。 一致的哈希码对于高效的 Distinct() 操作至关重要。 unchecked 关键字和素数乘法改善了哈希码分布。

通过正确实现 Equals()GetHashCode(),可以确保 Distinct() 将具有相同属性值的对象视为相等,从而提供预期的结果。

以上是为什么 LINQ 的 Distinct 对于自定义对象不能按预期工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn