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

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

    publicclassUser
    {
    publicUser(intid, stringname)
    {
    Id = id;
    Name = name;
    }

    publicintId { get; set; }

    publicstringName { get; set; }
    }

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

    publicclassUserComparer : IEqualityComparer<User>
    {
    #regionIEqualityComparer<User> 成员
    publicboolEquals(User x, User y)
    {
    if(x.Id == y.Id && x.Name == y.Name) //分别对属性进行比较
    returntrue; 
    else
    returnfalse; 
    }

    publicintGetHashCode(User obj)
    {
    return0;
    }
    #endregion
    }

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

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

    三、最后是去重复测式类:XXXX.Distinct(newUserComparer());进行去重复操作

    publicclassMainClass
    {
    publicstaticvoidMain()
    {
    List<User> list = newList<User>(); //添加一些测式数据
    list.Add(newUser(1, "张三"));
    list.Add(newUser(1, "李三"));
    list.Add(newUser(1, "小伟"));
    list.Add(newUser(1, "李三"));
    list.Add(newUser(2, "李四"));
    list.Add(newUser(2, "李武"));

    varquery = list.Distinct(newUserComparer()); //去重复

    foreach(varitem inquery)
    {
    Console.WriteLine(item.Id + ","+ item.Name); //输出Distinct之后的结果
    }

    Console.ReadLine();
    //输出结果:
    //1 , 张三
    //1 , 李三
    //1 , 小伟 
    //2 , 李四
    //2 , 李武
    }
    }
  • 相关阅读:
    转--- 一些概念不错的理解
    python 生产者 --- 消费者
    python GUI 之 tkinter
    读DataSnap源代码(二)
    读DataSnap源代码(一)
    FireDAC探索 (二)
    FireDAC内部初探
    C++Builder XE7 中“匿名”方法实现
    DelphiXE7 Datasnap TDSClientCallbackChannelManager内部实现初探
    C++ Builder使用VC DLL
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2701291.html
Copyright © 2011-2022 走看看