C# 使用Except比较2个列表

C# 使用Except比较2个列表,c#,.net,linq,C#,.net,Linq,我有2个列表,我想对其进行比较,并找出2个列表对象之间的差异 Animal对象包含以下属性 身份证 名字 年龄 列表list1中有10个Animal对象,其中aslist2中还有10个Animal对象。在这两个列表中有两个项目(Animal相同的对象) 当我使用Except函数时,我希望remainingList只包含两个列表之间不常见的对象。但是,remainingList包含一份list1的副本 我怎样才能解决这个问题 List<Animal> remainingList =

我有2个
列表
,我想对其进行比较,并找出2个
列表
对象之间的差异

Animal
对象包含以下属性

身份证

名字

年龄

列表
list1
中有10个
Animal
对象,其中as
list2
中还有10个
Animal
对象。在这两个列表中有两个项目(
Animal
相同的对象)

当我使用
Except
函数时,我希望
remainingList
只包含两个列表之间不常见的对象。但是,
remainingList
包含一份
list1
的副本

我怎样才能解决这个问题

 List<Animal> remainingList = list1.Except(list2).toListAsync();
List remainingList=list1.Except(list2.toListSync();

您需要重写类中的
Equal
GetHashCode
。大概是这样的:

public class Animal
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public override bool Equals(object obj)
    {
        if (!(obj is Animal))
            return false;
        var p = (Animal)obj;
        return p.Id == Id && p.Name == Name && p.Age == Age;
    }

    public override int GetHashCode()
    {
        return String.Format("{0}|{1}|{2}", Id, Name, Age).GetHashCode();
    }
}
或者使用较新版本的C#,您可以:


您需要在类中重写
Equal
GetHashCode
。大概是这样的:

public class Animal
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public override bool Equals(object obj)
    {
        if (!(obj is Animal))
            return false;
        var p = (Animal)obj;
        return p.Id == Id && p.Name == Name && p.Age == Age;
    }

    public override int GetHashCode()
    {
        return String.Format("{0}|{1}|{2}", Id, Name, Age).GetHashCode();
    }
}
或者使用较新版本的C#,您可以:


我强烈怀疑问题在于
Animal
没有覆盖
Equals
/
GetHashCode
或实现
IEquatable
。。。因此,
Except
将只比较
Animal
引用,而不是属性值。是否有解决方法。除了使用
之外,我还可以使用其他解决方案吗?@Illep-请参阅第一个重复的问题-有一些关于传递
IEqualityComparer
而不是重写方法的解释我强烈怀疑问题在于
Animal
没有重写
Equals
/
GetHashCode
或实现
IEquatable
。。。因此,
Except
将只比较
Animal
引用,而不是属性值。是否有解决方法。除了使用
之外,我还可以使用其他解决方案吗?@Illep-请参阅第一个重复的问题-有一些关于传递
IEqualityComparer
而不是重写方法的解释我认为强烈建议使用不可变属性来计算
GetHashCode
等于
。此外,我可以建议对hashcode使用
Property.GetHashcode()^Property.GetHashcode()..
吗?如果(obj==null)返回false,我还会添加一个
检查。在右边为null的任何情况下,实例都不相等。我认为强烈建议使用不可变属性来计算
GetHashCode
Equals
。此外,我可以建议对hashcode使用
Property.GetHashcode()^Property.GetHashcode()..
吗?如果(obj==null)返回false,我还会添加一个
检查。在右侧为null的任何情况下,实例都不相等。