Page Top

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

众所周知,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 }

Linq中,使用 SequenceEqual 比较两个集合的自定义比较器与上一致。

(注:进一步了解Equals和GetHashCode,请参考文章《聊一聊Equals()和GetHashCode()》: https://www.cnblogs.com/xiaochen-vip8/articles/5506478.html

posted @ 2020-04-27 15:19  抹茶大虾球丶  阅读(2456)  评论(0编辑  收藏  举报