zoukankan      html  css  js  c++  java
  • 用泛型的IEqualityComparer<T>接口去重复项

    提供者:porschev

    题目:下列数据放在一个List中,当ID和Name都相同时,去掉重复数据

    ID Name

    1  张三
    1  李三
    1  小伟
    1  李三 
    2  李四
    2  李武

    ------------------------------------------------------------------------------------------------------------

    解决这个问题,方法很多,最开始想到的就Enumerable.Distinct方法

    我们可能经常用的Distinct<TSource>(IEnumerable<TSource>)

    用它对数组这一类去重复

    这里要用Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 使用指定的 IEqualityComparer<T> 对值进行比较

    一、先为数据做个实体类:User

     1 public class User
     2 {
     3      public User(int id, string name)
     4      {
     5          Id = id;
     6          Name = name;
     7      }
     8 
     9      public int Id { get; set; }
    10 
    11      public string Name { get; set; }
    12  }
    View Code

    二、再自定义一个User比较类(实现IEqualityComparer<T>接口):UserComparer

     1 public class UserComparer : IEqualityComparer<User>
     2  {
     3      #region IEqualityComparer<User> 成员
     4      public bool Equals(User x, User y)
     5      {
     6          if (x.Id == y.Id && x.Name == y.Name)       //分别对属性进行比较
     7              return true;         
     8          else           
     9              return false;           
    10      }
    11 
    12      public int GetHashCode(User obj)
    13      {
    14          return 0;
    15      }
    16      #endregion
    17  }
    View Code

     自定义一个比较类,去继承IEqualityComparer接口,做一个Distinct方法的比较器。。

     Equals方法中对实体进行和你需求相关的比较操作,返回bool类型的返回值

    三、最后是去重复测式类:

    XXXX.Distinct(new UserComparer());进行去重复操作
     1  public class MainClass
     2   {
     3      public static void Main()
     4      {
     5          List<User> list = new List<User>();   //添加一些测式数据
     6          list.Add(new User(1, "张三"));
     7          list.Add(new User(1, "李三"));
     8          list.Add(new User(1, "小伟"));
     9          list.Add(new User(1, "李三"));
    10          list.Add(new User(2, "李四"));
    11          list.Add(new User(2, "李武"));
    12 
    13          var query = list.Distinct(new UserComparer());   //去重复
    14 
    15          foreach (var item in query)
    16          {
    17              Console.WriteLine(item.Id + "," + item.Name);   //输出Distinct之后的结果
    18          }
    19 
    20          Console.ReadLine();
    21          
    22          //输出结果:
    23          // 1 , 张三
    24          // 1 , 李三
    25          // 1 , 小伟                
    26          // 2 , 李四
    27          // 2 , 李武
    28      }
    29  }
    View Code

    或者直接:

     1 public class User:IEqualityComparer<User>
     2 {
     3      public User(int id, string name)
     4      {
     5          Id = id;
     6          Name = name;
     7      }
     8 
     9      public int Id { get; set; }
    10 
    11      public string Name { get; set; }
    12      
    13      public bool Equals(User x, User y)
    14      {
    15          if (x.Id == y.Id && x.Name == y.Name)       //分别对属性进行比较
    16              return true;         
    17          else           
    18              return false;           
    19      }
    20 
    21      public int GetHashCode(User obj)
    22      {
    23          return 0;
    24      }  
    25  }
    26 public class MainClass
    27   {
    28      public static void Main()
    29      {
    30          List<User> list = new List<User>();   //添加一些测式数据
    31          list.Add(new User(1, "张三"));
    32          list.Add(new User(1, "李三"));
    33          list.Add(new User(1, "小伟"));
    34          list.Add(new User(1, "李三"));
    35          list.Add(new User(2, "李四"));
    36          list.Add(new User(2, "李武"));
    37 
    38          var query = list.Distinct(new User());   //去重复
    39 
    40          foreach (var item in query)
    41          {
    42              Console.WriteLine(item.Id + "," + item.Name);   //输出Distinct之后的结果
    43          }
    44 
    45          Console.ReadLine();
    46          
    47          //输出结果:
    48          // 1 , 张三
    49          // 1 , 李三
    50          // 1 , 小伟                
    51          // 2 , 李四
    52          // 2 , 李武
    53      }
    54  }
    View Code
  • 相关阅读:
    实验10:Problem D: STL——管道二
    实验10:Problem C: STL——呵呵型自动机
    实验10:Problem B: STL——哈哈型自动机
    实验10:Problem A: STL——整理唱片
    实验9:Problem I: 学生干部虚基类
    hihocoder1994 树与落叶 DFS+前缀和+二分
    [Offer收割]编程练习赛108
    【模板】左偏树(可并堆)
    P2993 [FJOI2014]最短路径树问题 点分治+最短路
    E
  • 原文地址:https://www.cnblogs.com/zxbzl/p/3513199.html
Copyright © 2011-2022 走看看