C# 使用Except比较2个列表
我有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个列表
对象之间的差异
Animal
对象包含以下属性
身份证
名字
年龄
列表list1
中有10个Animal
对象,其中aslist2
中还有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的任何情况下,实例都不相等。