当前位置: 移动技术网 > IT编程>开发语言>c# > C# 两个List<T>(T是类)使用Contains比较元素的方法

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

2020年04月27日  | 移动技术网IT编程  | 我要评论
众所周知,List<T>创建的对象是引用类型,也就是说,两个完全相同的List<T>对象(其中元素及其元素的属性也相同),但引用地址不同,在使用Contains判断两List<T>中元素包含比较时,返回都是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()》: )

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网