📜  c# list.except 使用 IEqualityComparer 比较类 - C# (1)

📅  最后修改于: 2023-12-03 14:39:43.596000             🧑  作者: Mango

C# List.Except 使用 IEqualityComparer 比较类

在C#中,List是一种常见的数据结构,用于存储一系列元素。List.Except方法允许我们从一个List中删除另一个List中的元素。但是,List.Except默认使用元素的默认比较方法,如果我们需要自定义比较方法,就需要使用IEqualityComparer接口来实现。

IEqualityComparer接口

IEqualityComparer接口定义了用于比较两个对象是否相等的方法。它有两个方法:

bool Equals(T x, T y);
int GetHashCode(T obj);

Equals方法比较两个对象是否相等,返回一个boolean值。GetHashCode方法返回一个用于对象哈希化的32位有符号整数。

使用IEqualityComparer

以下是一个使用IEqualityComparer自定义比较方法的示例。

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class StudentNameEqualityComparer : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(Student obj)
    {
        return obj.Name.GetHashCode();
    }
}

上面代码定义了一个Student类和一个StudentNameEqualityComparer类,StudentNameEqualityComparer实现了IEqualityComparer接口,它只比较学生的姓名。

现在我们有两个学生列表:

List<Student> students1 = new List<Student>
{
    new Student { ID = 1, Name = "John" },
    new Student { ID = 2, Name = "Mary" },
    new Student { ID = 3, Name = "Peter" }
};

List<Student> students2 = new List<Student>
{
    new Student { ID = 4, Name = "Mary" },
    new Student { ID = 5, Name = "Tom" },
    new Student { ID = 6, Name = "Helen" }
};

现在我们可以使用List.Except方法来计算差异:

var differentStudents = students1.Except(students2, new StudentNameEqualityComparer());

以上代码计算了students1列表中所有不在students2列表中的Student对象,使用StudentNameEqualityComparer来比较两个Student对象。

总结

C#中的List.Except方法允许我们从一个List中删除另一个List中的元素,但是默认使用元素的默认比较方法。如果我们需要自定义比较方法,就需要使用IEqualityComparer接口来实现。在使用List.Except方法时,我们可以指定自定义的比较方法。