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

    原贴地址:http://www.cnblogs.com/zhongweiv/archive/2011/11/11/IEqualityComparer.html

    写这个源于CSDN一位网友的提问

    题目:下列数据放在一个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

    public class User
    {
         public User(int id, string name)
         {
             Id = id;
             Name = name;
         }
    
         public int Id { get; set; }
    
         public string Name { get; set; }
     }
    

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

    public class UserComparer : IEqualityComparer<User>
     {
         #region IEqualityComparer<User> 成员
         public bool Equals(User x, User y)
         {
             if (x.Id == y.Id && x.Name == y.Name)       //分别对属性进行比较
                 return true;         
             else           
                 return false;           
         }
    
         public int GetHashCode(User obj)
         {
             return 0;
         }
         #endregion
     }
    

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

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

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

    XXXX.Distinct(new UserComparer());进行去重复操作
    public class MainClass
      {
         public static void Main()
         {
             List<User> list = new List<User>();   //添加一些测式数据
             list.Add(new User(1, "张三"));
             list.Add(new User(1, "李三"));
             list.Add(new User(1, "小伟"));
             list.Add(new User(1, "李三"));
             list.Add(new User(2, "李四"));
             list.Add(new User(2, "李武"));
    
             var query = list.Distinct(new UserComparer());   //去重复
    
             foreach (var item in query)
             {
                 Console.WriteLine(item.Id + "," + item.Name);   //输出Distinct之后的结果
             }
    
             Console.ReadLine();
             
             //输出结果:
             // 1 , 张三
             // 1 , 李三
             // 1 , 小伟                
             // 2 , 李四
             // 2 , 李武
         }
     }
  • 相关阅读:
    近期C#小问题总结
    Arcgis由栅格数据提取等值线
    Arcgis由离散点制作核密度图
    用Arcgis为离散点区域生成格网(渔网)
    Arcengine合并面要素
    对离散点进行抽稀
    对离散点进行区域分割
    关于异常来自 HRESULT:0x80040351
    分布式缓存---Memcached 入门
    Mongodb安装 for windows7 64位
  • 原文地址:https://www.cnblogs.com/zhuiyi/p/2916889.html
Copyright © 2011-2022 走看看