通过忽略几个属性来比较两个自定义列表对象

时间:2019-02-14 16:34:29

标签: c# linq

我有两个具有属性的自定义列表对象:ID(自动生成-Guid),EmpoyeeID,名字,姓氏和雇佣状态。

我想使用Except()关键字比较两个列表的区别,但是我想专门忽略ID属性。

如何忽略ID属性以查找两个列表之间的差异?

1 个答案:

答案 0 :(得分:3)

您可以创建自己的IEqualityComparer自定义实现,如下所示:

这是一个Fiddle示例,其中应返回List1的最后四名员工:https://dotnetfiddle.net/f3sBLq

在此示例中,EmployeeComparer继承自IEqualityComparer<Employee>,其中Employee是具有您列出的属性(EmployeeID,Firstname,Lastname,Employmentstatus)的类

public class EmployeeComparer : IEqualityComparer<Employee>
{
    public int GetHashCode(Employee co)
    {
        if (co == null)
        {
            return 0;
        }

        //You can use any property you want (other than EmployeeID for your purposes); the GetHashCode metho is used to generate an address to where the object is stored
        return co.Employmentstatus.GetHashCode();
    }

    public bool Equals(Employee x1, Employee x2)
    {
        if (object.ReferenceEquals(x1, x2))
        {
            return true;
        }

        if (object.ReferenceEquals(x1, null) || object.ReferenceEquals(x2, null))
        {
            return false;
        }

        // Check for equality with all properties except for EmployeeID
        return x1.Employmentstatus == x2.Employmentstatus && x1.Firstname == x2.Firstname && x1.Lastname == x2.Lastname;
    }
}

然后您可以像这样使用它:

var results = List2.Except(List1, new EmployeeComparer()).ToList();

编辑:原始问题未将ID列为属性,并要求如何排除EmployeeID,而这正是该答案和Fiddle链接示例所基于的。