如何比较相同复杂类型的两个列表?

时间:2018-11-30 09:42:26

标签: c# linq

我有两个复杂类型相同的列表,即。课。

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();

我在做什么错了?

这不是重复的问题,因为“原始”问题没有得到回答并且含糊其辞。更进一步,这个问题引入了比较匿名对象的可能性。

1 个答案:

答案 0 :(得分:1)

您没有在Equals类中覆盖GetHashCode / Info,因此Except无法确定两个给定的Info对象之间的相等性

这在您使用Anonymous types时有效:

  

因为匿名类型的等于 GetHashCode 方法是   根据等于 GetHashCode 方法   属性,只有相同的两个匿名类型的实例是相等的   它们的所有属性都相等