• 用泛型的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 , 李武
    }
    }
  • 相关阅读:
    STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
    STM32F10x_RTC日历
    STM32F4_TIM输入波形捕获(脉冲频率)
    详解 C 语言开发五子棋游戏以及游戏中的重要算法与思路
    平安银行 深度解析梧州模式 或许是国内医药分开最好的模板!
    屏蔽双绞线和非屏蔽双绞线之间的区别
    如何刷新本地的DNS缓存?
    无线网络发射和接收的物理原理!
    wifi基本原理
    大润发创始人黄明端挥泪离场:我战胜了所有对手,却输给了时代!
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2701291.html
Copyright © 2020-2023  润新知