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

    写这个源于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#线程带参数
    svn自动update到指定目录
    204. 计数质数
    178. 分数排名
    387. 字符串中的第一个唯一字符
    374. 猜数字大小
    371. 两整数之和
    350. 两个数组的交集 II
    326. 3的幂
    219. 存在重复元素 II
  • 原文地址:https://www.cnblogs.com/zhongweiv/p/IEqualityComparer.html
Copyright © 2011-2022 走看看