博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让linq 的distinct更方便一点吧
阅读量:5908 次
发布时间:2019-06-19

本文共 1473 字,大约阅读时间需要 4 分钟。

linq 的 Distinct在集合操作中经常被用到。对于值类型的,很方便,直接Distinct()即可,但是对引用类型,需要实现一个IEqualityComparer
的接口。
对每种引用类型,分别实现接口实在是太麻烦了。
 
一般来说,做这种distinct的时候,都是根据object的一个属性来判断是否是一个值。
比如:
public class User    {        public int ID { get; set; }        public string Name { get; set; }    }
一般来说,都是通过id这个属性来判断的,id一样既认为是同一个。
当然可以通过override User的equals和gethashcode来实现,但是不灵活。
如果我这次通过id来distinct下次通过name来distinct怎么办呢?
我希望有这样一种写法
var list = new List
();
list.Distinct(x => x.ID)

只要指定通过那个属性来判断,即可做出distinct

 

自己来写个扩展方法吧

1: public static IEnumerable
Distinct
(this IEnumerable
source, Func
CompareSelector)
2: {
3:     return source.Distinct(new SinglePropertyEqualityComparer
(CompareSelector));
4: }
5:
6: public class SinglePropertyEqualityComparer
: IEqualityComparer
7: {
8:     private readonly Func
CompareSelector;
9:
10:     public SinglePropertyEqualityComparer(Func
compareSelector)
11:     {
12:         CompareSelector = compareSelector;
13:     }
14:
15:     public bool Equals(T x, T y)
16:     {
17:         return CompareSelector(x).Equals(CompareSelector(y));
18:     }
19:
20:     public int GetHashCode(T obj)
21:     {
22:         return CompareSelector(obj).GetHashCode();
23:     }
24: }

 

 

只是linq 2 object哦。

转载于:https://www.cnblogs.com/czcz1024/archive/2012/11/28/2792554.html

你可能感兴趣的文章
分享14个jQuery插件开发人员易犯的错误
查看>>
两个excel宏病毒
查看>>
ubuntu上跑python连接pg,报错 ImportError: No module named psycopg2
查看>>
vi编辑器使用介绍
查看>>
Microsoft Visual Studio 发展历史
查看>>
php对数组中的值进行排序
查看>>
BZOJ 1207 DP
查看>>
【译】Android系统架构
查看>>
Java 9将采用新的版本字符串格式
查看>>
winsocket <研究了一天的成果>
查看>>
hdu 1181 变形课
查看>>
[心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连...
查看>>
Docker-容器的操作
查看>>
PHP下载远程图片的3个方法
查看>>
Apache版本hadoop-2.6.0.tar.gz平台下搭建Hue
查看>>
在ubuntu16.04上编译android源码【转】
查看>>
Android JNI技术介绍【转】
查看>>
超文本
查看>>
servlet调用的几种方式
查看>>
C# 中的"yield"与 "yield break"使用
查看>>