C#实现 Linq 序列的Distinct—— IEnumerable.Distinct()——IEqualityComparer
转载自诗人江湖老,原文地址
在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相关推荐
- [C#]关于Distinct与重写IEqualityComparer时得知道的二三事
我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是Linq的Distinct方法. 先定义一个类,然后使用Distinct方法去重 class Man{public int Age ...
- PG distinct与distinct on
PG distinct与distinct on 添加链接描述
- Linq to SQL -- Select、Distinct和Count、Sum、Min、Max、Avg
Select/Distinct操作符 适用场景:o(∩_∩)o- 查询呗. 说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也 ...
- Linq实现In条件和Distinct效果
In写法: arrayDictype:int数组 db.GetQuery<SysDataDictionaryEntity>().Where(a => arrayDictype.Con ...
- Linq之IQueryable与IEnumerable
linq它居然有 有to 之说 !!!! 比如 to sql,to entity 下面第一个using就是to sql 写法比较类似sql语句, 第二个using 就是to entity省略了fro ...
- php distinct 用法,distinct的用法
1. Distinct 位置 单独的distinct只能放在开头,否则报错,语法错误 例:SELECT Sid,DISTINCT(Sscore) score from t_student; [SQL ...
- distinct与distinct 的使用
distinct:sql中返回的的字段只能是distinct的那个字段: select distinct id from student; 如果在查询中除了需要去重返回多个字段,需要用distinct ...
- PGSQL中distinct和distinct on的用法与区别
1.distinct是按照列去重 语法是: select distinct 列名[, 列名...] from 表名 使用distinct关键字查询时,是去掉某一(多)列中重复的值. 举个例子,比如我们 ...
- distinct返回null报错_C#之集合常用扩展方法与Linq
一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...
最新文章
- 一位资深程序员面试Python工程师的岗位心得和历程
- redmine 2.2.x 修改文档附件的存放目录
- div的visibility和display属性区别
- TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
- 在Spring中使用Future对象调用Async方法调用
- Vue项目中使用 路由导航守卫 处理页面的访问权限
- C++全局变量的声明和定义
- gentoo 安装php7,在Gentoo安装Wifidog Portal
- 微软职位内部推荐-Software Engineer
- 【实习】【算法】百度面经之四
- linux编程之main()函数启动过程【转】
- 常见开发工具下载链接
- Mac下nginx配置虚拟主机,访问报错502
- BZOJ 2794: [Poi2012]Cloakroom 询问离线 背包dp
- 转:『代码』JS封装 Ajax级联下拉列表
- winrar.msi_如何使WinRAR自动化以从setup.exe和MSI文件制作单个文件安装程序
- IDEA全局查找快捷键
- 王者荣耀微信哪个服务器怎么选,王者荣耀:国服战力对比!手Q和微信哪个大区的战力更胜一筹?...
- 光纤设备及跳线接口图鉴
- gdb+openocd+stlink调试MCU
热门文章
- Flask+uwsgi+Nginx环境搭建
- Linux 指令篇:文档编辑--col
- as和强制类型转换的区别
- 广东2021高考成绩位次查询,广东一分一段表查询2021-广东省2021年一分一段统计表...
- 添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践
- 树莓派安装smbus_树莓派使用smbus不兼容问题(no module named 'smbus')
- win10卓越性能模式,提升电脑性能
- java 注释快捷打出时间_Java快捷---自动注释时间作者。。。
- redis 值字符串前面部分乱码_redis key乱码
- c语言int a什么意思,问一下吧里大神 int a = a; 这么定义是什么意思?