用泛型的IEqualityComparer接口去重复项 .

写这个源于这个网友的题问:http://topic.csdn.net/u/20110803/16/031363d0-831d-4795-8c29-458d1271cc83.html?48229


题目:下列数据放在一个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 { getset; }  
  10.   
  11.      public string Name { getset; }  
  12.  }  

二、再自定义一个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. }  

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

  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);  
  18.         }  
  19.   
  20.         Console.ReadLine();  
  21.         //输出结果:  
  22.         // 1 , 张三  
  23.         // 1 , 李三  
  24.         // 1 , 小伟                  
  25.         // 2 , 李四  
  26.         // 2 , 李武  
  27.     }  
  28. }  
原文地址:https://www.cnblogs.com/aaa6818162/p/2177118.html