用泛型的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 }
二、再自定义一个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 }
自定义一个比较类,去继承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 }
或者直接:
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 }