我有两个复杂类型相同的列表,即。课。
var list1 = new List<Info>();
list1.Add(new Info(){ A = 100, B = 100 });
list1.Add(new Info(){ A = 200, B = 200 });
var list2 = new List<Info>();
list2.Add(new Info(){ A = 20, B = 20 });
list2.Add(new Info(){ A = 200, B = 200 });
public class Info
{
public int A {get;set;}
public int B {get;set; }
}
当我这样做
list1.Except(list2);
我得到一个不正确的结果。显然,结果显示了List1的所有项目。
{ A = 100, B = 100 }
{ A = 200, B = 200 }
当我使用匿名类进行相同的操作时,我会得到正确的结果
list1.Select(a=> new { A = a.A, B = a.B}).Except(list2.Select(b=> new {A = b.A, B = b.B})).ToList();
我在做什么错了?
这不是重复的问题,因为“原始”问题没有得到回答并且含糊其辞。更进一步,这个问题引入了比较匿名对象的可能性。
答案 0 :(得分:1)
您没有在Equals
类中覆盖GetHashCode
/ Info
,因此Except
无法确定两个给定的Info
对象之间的相等性
这在您使用Anonymous types时有效:
因为匿名类型的等于和 GetHashCode 方法是 根据等于和 GetHashCode 方法 属性,只有相同的两个匿名类型的实例是相等的 它们的所有属性都相等。