转载自诗人江湖老,原文地址

  在C#中使用List或者Collection的时候,我们经常需要使用到Distinct操作,但是微软默认提供的Distinct重载方法并不能满足我们的需求。这时候,我们就需要自己动手做一番工作了。

Distinct方法的重载

  Linq的Distinct的方法有如下一个重载版本:

public static IEnumerable<TSource> Distinc<TSource>(this IEnumerable<TSource> source,IEqualityComparer<TSource> comparer
)

  其中:
  类型参数
  TSource
    source中的元素类型;
  参数
  source
    类型: System.Collections.Generic.IEnumerable<TSource>
    要从中移除重复元素的序列
  comparer
    类型:System.Collections.Generic.IEqualityComparer<TSource>
    用于比较值的 IEqualityComparer<T>
  
  返回值
    类型:System.Collections.Generic.IEnumerable<TSource>
    一个 IEnumerable<T>,包含源序列中的非重复元素。
 

实现IEqualityComparer

  现在关键就是如何实现方法中的comparer 参数,我们希望做一个能够适用于各个类型的comparer,这样,我们就需要用到委托。
  好,话不多说,代码如下:

using System.Collections.Generic;namespace MissTangProject.HelperClass
{public class ListComparer<T> : IEqualityComparer<T>{public delegate bool EqualsComparer<F>(F x, F y);public EqualsComparer<T> equalsComparer;public ListComparer(EqualsComparer<T> _euqlsComparer){this.equalsComparer = _euqlsComparer;}public bool Equals(T x, T y){if (null != equalsComparer){return equalsComparer(x, y);}else{return false;}}public int GetHashCode(T obj){return obj.ToString().GetHashCode();}}
}

使用Linq的Distinct方法

  假设我们有一个BoilerWorkerModel类,该类有一个code属性,使用方法如下:
  

List<BoilerWorkerModel> newList = _list1.Distinct(new ListComparer<BoilerWorkerModel>((p1, p2) => (p1.Code == p2.Code))).ToList();
  • 1

  这样,我们就实现了能够适用于各个类型source的comparer了,可以随意的使用Linq的Distinct方法了!
  到这里,大功告成。

C#实现 Linq 序列的Distinct—— IEnumerable.Distinct()——IEqualityComparer相关推荐

  1. [C#]关于Distinct与重写IEqualityComparer时得知道的二三事

    我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是Linq的Distinct方法. 先定义一个类,然后使用Distinct方法去重 class Man{public int Age ...

  2. PG distinct与distinct on

    PG distinct与distinct on 添加链接描述

  3. Linq to SQL -- Select、Distinct和Count、Sum、Min、Max、Avg

    Select/Distinct操作符 适用场景:o(∩_∩)o- 查询呗. 说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也 ...

  4. Linq实现In条件和Distinct效果

    In写法: arrayDictype:int数组 db.GetQuery<SysDataDictionaryEntity>().Where(a => arrayDictype.Con ...

  5. Linq之IQueryable与IEnumerable

    linq它居然有 有to 之说 !!!! 比如 to sql,to entity 下面第一个using就是to sql  写法比较类似sql语句, 第二个using 就是to entity省略了fro ...

  6. php distinct 用法,distinct的用法

    1.  Distinct 位置 单独的distinct只能放在开头,否则报错,语法错误 例:SELECT Sid,DISTINCT(Sscore) score from t_student; [SQL ...

  7. distinct与distinct 的使用

    distinct:sql中返回的的字段只能是distinct的那个字段: select distinct id from student; 如果在查询中除了需要去重返回多个字段,需要用distinct ...

  8. PGSQL中distinct和distinct on的用法与区别

    1.distinct是按照列去重 语法是: select distinct 列名[, 列名...] from 表名 使用distinct关键字查询时,是去掉某一(多)列中重复的值. 举个例子,比如我们 ...

  9. distinct返回null报错_C#之集合常用扩展方法与Linq

    一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...

最新文章

  1. 一位资深程序员面试Python工程师的岗位心得和历程
  2. redmine 2.2.x 修改文档附件的存放目录
  3. div的visibility和display属性区别
  4. TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
  5. 在Spring中使用Future对象调用Async方法调用
  6. Vue项目中使用 路由导航守卫 处理页面的访问权限
  7. C++全局变量的声明和定义
  8. gentoo 安装php7,在Gentoo安装Wifidog Portal
  9. 微软职位内部推荐-Software Engineer
  10. 【实习】【算法】百度面经之四
  11. linux编程之main()函数启动过程【转】
  12. 常见开发工具下载链接
  13. Mac下nginx配置虚拟主机,访问报错502
  14. BZOJ 2794: [Poi2012]Cloakroom 询问离线 背包dp
  15. 转:『代码』JS封装 Ajax级联下拉列表
  16. winrar.msi_如何使WinRAR自动化以从setup.exe和MSI文件制作单个文件安装程序
  17. IDEA全局查找快捷键
  18. 王者荣耀微信哪个服务器怎么选,王者荣耀:国服战力对比!手Q和微信哪个大区的战力更胜一筹?...
  19. 光纤设备及跳线接口图鉴
  20. gdb+openocd+stlink调试MCU

热门文章

  1. Flask+uwsgi+Nginx环境搭建
  2. Linux 指令篇:文档编辑--col
  3. as和强制类型转换的区别
  4. 广东2021高考成绩位次查询,广东一分一段表查询2021-广东省2021年一分一段统计表...
  5. 添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践
  6. 树莓派安装smbus_树莓派使用smbus不兼容问题(no module named 'smbus')
  7. win10卓越性能模式,提升电脑性能
  8. java 注释快捷打出时间_Java快捷---自动注释时间作者。。。
  9. redis 值字符串前面部分乱码_redis key乱码
  10. c语言int a什么意思,问一下吧里大神 int a = a; 这么定义是什么意思?