首页 > 后端开发 > C++ > 如何确保 LINQ 的 Distinct 方法与自定义对象正确的对象相等?

如何确保 LINQ 的 Distinct 方法与自定义对象正确的对象相等?

Linda Hamilton
发布: 2025-01-20 19:41:14
原创
504 人浏览过

How to Ensure Correct Object Equality for LINQ's Distinct Method with Custom Objects?

使用IEquatable处理LINQ Distinct中的对象相等性

LINQ的Distinct方法旨在根据对象的相等性识别唯一对象。但是,对于自定义对象,它可能并不总是按预期工作。

在提供的示例中,Distinct方法未能识别名称相同的两个Author对象为重复项。这是因为LINQ根据对象的引用地址而不是其属性值将对象视为不同的。

为了解决这个问题,可以在Author类中实现IEquatable接口。通过重写Equals方法,您可以定义自定义逻辑,以根据属性值FirstNameLastName确定相等性。下面的实现检查两个字段中的匹配值以确定相等性:

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);
    }
}
登录后复制

用法:

应用此自定义实现解决了Distinct的问题。修改后的代码正确地识别了重复的Author对象,并从结果中删除了其中一个:

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();
    }
}
登录后复制

结论:

实现IEquatable并重写Equals方法允许在LINQ操作中自定义对象相等性的定义。这确保了Distinct方法根据其属性而不是引用地址正确处理自定义对象。

请注意,代码示例中已对GetHashCode方法进行了改进,以确保与Equals方法的一致性,并使用了null-conditional operator (?.) 来处理可能为null的属性。 这避免了潜在的NullReferenceException异常。

以上是如何确保 LINQ 的 Distinct 方法与自定义对象正确的对象相等?的详细内容。更多信息请关注PHP中文网其他相关文章!

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