C# 兩個List (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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM