我试图在
LinqPad中使用list.Union合并两个列表,但是我不能让它工作,想检查我的理解是否正确.
给定这个简单的类:
public class Test { public int Id { get; set;} public int field1 { get; set; } public bool Equals(Test other) { return this.Id.Equals(other.Id); } }
和两个列表填充如下:
List<Test> list = new List<Test>(); list.Add( new Test { Id = 1,field1 = 1}); list.Add( new Test { Id = 1,field1 = 2}); list.Add( new Test { Id = 2,field1 = 3}); list.Add( new Test { Id = 2,field1 = 4}); List<Test> list2 = new List<Test>(); list2.Add( new Test { Id = 1,field1 = 1}); list2.Add( new Test { Id = 1,field1 = 2}); list2.Add( new Test { Id = 2,field1 = 3}); list2.Add( new Test { Id = 2,field1 = 4});
然后我尝试:var mergedList = list.Union(list2).ToList();并使用简单的foreach循环输出数据并获取此输出:
ID: 1 -------- 1 ID: 1 -------- 2 ID: 2 -------- 3 ID: 2 -------- 4 ID: 1 -------- 1 ID: 1 -------- 2 ID: 2 -------- 3 ID: 2 -------- 4
ID: 1 -------- 1 ID: 1 -------- 2 ID: 2 -------- 3 ID: 2 -------- 4
我做错了什么或者我误解了吗?
此外,如果没有明确地覆盖Test类中的Equals方法,它是否工作?
谢谢
解决方法
在你的情况下,你只需要定义一些方法,LINQ什么都不知道.这就像创建方法bool HeyEquateMeWith(测试其他),并期望LINQ将在进行设置操作时调用它.
你需要定义你的类如下(覆盖Object的Equals和GetHashCode方法):
public class Test { public int Id { get; set;} public int field1 { get; set; } public override bool Equals(object other) //note parameter is of type object { Test t = other as Test; return (t != null) ? Id.Equals(t.Id) : false; } public override int GetHashCode() { return Id.GetHashCode(); } }
现在,联盟将会调用您重写的Equals和GetHashCode方法.当你覆盖Equals方法时,你也应该用ALWAYS来覆盖GetHashCode.