用泛型的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
原文地址:https://www.cnblogs.com/zxbzl/p/3513199.html