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

C# 如何比较相同复杂类型的两个列表?,c#,linq,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

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

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; }
}
我得到了一个不正确的结果。显然,结果显示了列表1的所有项目

{ 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();
我做错了什么


这不是一个重复的问题,因为“原始”问题在未回答和含糊不清的解释。此外,这个问题还引入了比较匿名对象的可能性。

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

当您使用以下选项时,此选项有效:

因为匿名类型上的EqualsGetHashCode方法是 根据的EqualsGetHashCode方法定义 属性,相同匿名类型的两个实例只有在 它们的所有属性都相同


Info
类上重写Equals。为了使
除外
确定两个元素相等,您必须通过重写
Equals
来指示“Equals”的含义,或者,如果您无法更改
Info
-类,则通过提供
IEqualityComparer
。您可以获得
list1
中不存在的所有元素。结果是正确的,因为类(
Info
)是通过引用进行比较的。因此,尽管两个列表中第二个
Info
的值相同,但它们是不同的实例,因此并不相等。您需要覆盖
Info
类上的
Equals
方法,以您想要的方式比较它们。查看
Tuple
s,尤其是命名Tuple。对于已回答的问题,这是您的答案吗?很短,不是吗?只给出了一个模糊的想法。@HimBromBeere问题是“我做错了什么?”当实现
Equals
时,我们必须实现
GetHashCode
well@mko因为anonymolus对象是通过比较每个成员来比较的。@mko因为它们在编译的类型中被重写。对不起,我对此的评论不太清楚。有关更多详细信息,请参阅。
list1.Select(a=> new { A = a.A, B = a.B}).Except(list2.Select(b=> new {A = b.A, B = b.B})).ToList();