首页 > 后端开发 > C++ > 为什么 LINQ 的 Distinct 不能与自定义对象一起使用,如何修复它?

为什么 LINQ 的 Distinct 不能与自定义对象一起使用,如何修复它?

Susan Sarandon
发布: 2025-01-20 19:37:11
原创
624 人浏览过

Why Doesn't LINQ's Distinct Work with Custom Objects, and How Can I Fix It?

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() 方法现在根据 FirstNameLastName 比较作者。 GetHashCode() 方法确保具有相同值的对象的一致散列。 现在,Distinct() 将根据姓名正确识别并删除重复的作者。

结论:为Distinct()

定制平等

实现 IEquatable<T> 提供了一种关键机制来控制如何比较自定义对象是否相等,从而使 Distinct() 在处理基于值的重复项时能够正确运行。 这可确保 Distinct() 按预期运行,根据您定义的重要属性删除重复项。

以上是为什么 LINQ 的 Distinct 不能与自定义对象一起使用,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板