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
对象之间的相等性
当您使用以下选项时,此选项有效:
因为匿名类型上的Equals和GetHashCode方法是
根据的Equals和GetHashCode方法定义
属性,相同匿名类型的两个实例只有在
它们的所有属性都相同
在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();