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()》: )