C#实现 Linq 序列的Distinct—— IEnumerable.Distinct()——IEqualityComparer
2019-01-17 14:24
375 查看
在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<T>.Distinct<T>()——IEqualityComparer
- IEqualityComparer for Linq Distinct() 通用类
- LINQ Distinct without IEqualityComparer
- 用委托来实现IEqualityComparer接口
- Distinct<TSource>(IEqualityComparer<TSource> comparer) 根据列名来Distinct
- C#中自定义比较器 IEqualityComparer 接口的使用
- LinqToEntities:Union IEqualityComparer
- C# IEqualityComparer 去重
- C# IEqualityComparer
- c#List结合IEqualityComparer求交集
- IEqualityComparer<T> VS System.IEquatable<T>
- C# IEnumerable和IEnumerator的区别,如何实现
- C# 用Linq实现DataTable实现重复数据过滤
- 禁用IE的后退按钮|显示网页已过期|几种语言的实现方法|c#|javascript|html
- c# 实现IComparable、IComparer接口、Comparer类的详解
- C#实现的不重复随机数序列生成算法
- C# 用Linq的方式实现对Xml文件的基本操作(创建xml文件、增删改查xml文件节点信息)zz
- C# 用Linq的方式实现对Xml文件的基本操作(创建xml文件、增删改查xml文件节点信息)
- 关于CollectionBase抽象类,IEnumerable,IEnumerator以及IComparer,IComparable的实现
- C# IEnumerable和IEnumerator的区别,如何实现