zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    内存可用性判断 IsBadCodePtr IsBadReadPtr 等等
    部署到Linux使用VS Code 开发.NET Core 应用程序
    Gulp.js简介
    net WebApi中使用swagger
    深入理解
    软件框架
    重拾linux
    Linux创建修改删除用户和组
    Linux 之 rsyslog
    Lua 解释器
  • 原文地址:https://www.cnblogs.com/seanyan/p/12765151.html
Copyright © 2011-2022 走看看