c# – 在LINQ中使用Union合并列表时删除重复项

发布时间:2020-02-14 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了c# – 在LINQ中使用Union合并列表时删除重复项脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在 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.

总结

以上是脚本之家为你收集整理的c# – 在LINQ中使用Union合并列表时删除重复项全部内容,希望文章能够帮你解决c# – 在LINQ中使用Union合并列表时删除重复项所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。

脚本之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ” ,选择关注!
精选程序员所需精品干货内容!

标签: