欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 两个List(T是类)使用Contains比较元素的方法

程序员文章站 2022-06-21 19:38:05
众所周知,List创建的对象是引用类型,也就是说,两个完全相同的List对象(其中元素及其元素的属性也相同),但引用地址不同,在使用Contains判断两List中元素包含比较时,返回都是False,因此,我们需要重新“定义”Contains,实际上,Contains内部是Equa ......

众所周知,list<t>创建的对象是引用类型,也就是说,两个完全相同的list<t>对象(其中元素及其元素的属性也相同),但引用地址不同,在使用contains判断两list<t>中元素包含比较时,返回都是false,因此,我们需要重新“定义”contains,实际上,contains内部是equals方法的封装,所以,我们需要重写equals方法:

 1  public class userinfo : iequatable<userinfo>
 2  {
 3      public string username { get; set; }
 4      public int age { get; set; }
 5 
 6      // 重写equals方法
 7      public override bool equals(object obj)
 8      {
 9          if (obj == null) return false;
10 
11          userinfo usr = obj as userinfo;
12          if (usr == null)
13              return false;
14          else
15              return equals(usr);
16      }
17 
18      // 此方法必须一起重写
19      public override int gethashcode()
20      {
21          return username.gethashcode() ^ age.gethashcode();
22      }
23 
24      // 实际调用的equals方法
25      public bool equals(userinfo usr)
26      {
27          if (usr == null) return false;
28          return (this.username == usr.username && this.age == usr.age);
29      }
30  }
 1 static void main(string[] args)
 2 {
 3     list<userinfo> users1 = new list<userinfo>()
 4     {
 5         new userinfo(){username="aaa",age=20},
 6         new userinfo(){username="bbb",age=30},
 7     };
 8 
 9     list<userinfo> users2 = new list<userinfo>()
10     {
11         new userinfo(){username="aaa",age=20},
12         new userinfo(){username="bbb",age=40},
13     };
14 
15     users1.foreach((m) =>
16     {
17         if (!users2.contains(m))
18             console.writeline($"users1中有,但users2中没有:{m.username},{m.age}");
19     });
20     // 结果:bbb,30
21 
22     users2.foreach((m) =>
23     {
24         if (!users1.contains(m))
25            console.writeline($"users2中有,但users1中没有:{m.username},{m.age}");
26     });
27     // 结果:bbb,40
28 
29     console.readkey();
30 }

(注:进一步了解equals和gethashcode,请参考文章《聊一聊equals()和gethashcode()》: )