Linq的Distinct方法的扩展
为什么80%的码农都做不了架构师?>>>
原文地址:如何很好的使用Linq的Distinct方法
Person1: Id=1, Name=
"Test1"
Person2: Id=1, Name=
"Test1"
Person3: Id=2, Name=
"Test2"
以上list如果直接使用distinct方法进行过滤,仍然返回3条数据,而需要的结果是2条数据。下面给出解这个问题的方法:
方法1: Distinct 方法中使用的相等比较器。这个比较器需要重写Equals和GetHashCode方法,个人不推荐,感觉较麻烦,需要些多余的类,并且用起来还要实例化一个比较器,当然自己也可以写一个泛型的比较器生成工厂用来专门生成比较器,但仍然觉得较麻烦。
MSDN给出的做法,具体参照:http://msdn.microsoft.com/zh-cn/library/bb338049.aspx
方法2:自己扩展一个DistinctBy。这个扩展方法还是很不错的,用起来很简洁,适合为框架添加的Distinct扩展方法。
public
static
IEnumerable<TSource> DistinctBy<TSource, TKey> (
this
IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys =
new
HashSet<TKey>();
foreach
(TSource element
in
source)
{
if
(seenKeys.Add(keySelector(element)))
{
yield
return
element;
}
}
}
使用方法如下(针对ID,和Name进行Distinct):
var
query = people.DistinctBy(p =>
new
{ p.Id, p.Name });
若仅仅针对ID进行distinct:
var
query = people.DistinctBy(p => p.Id);
方法3:通过GroupBy分组后,并取出第一条数据。简单易用,很方便。这是一种迂回策略,代码理解起来没有Distinct表意清晰,虽然实现了效果。
List<Person> distinctPeople = allPeople
.GroupBy(p =>
new
{p.Id, p.Name} )
.Select(g => g.First())
.ToList();
以上,您觉得哪种方案更好一些呢?个人最偏向于第二种用法,您呢?
转载于:https://my.oschina.net/wzzz/blog/371531
Linq的Distinct方法的扩展相关推荐
- 如何很好的使用Linq的Distinct方法
Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...
- Linq的Distinct方法
Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...
- 【C#】详解使用Enumerable.Distinct方法去重
Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法 ...
- 【More Effective C#】LINQ表达式与方法调用的映射
LINQ构建在两个概念之上,一种查询语言和一系列将查询语言转换成方法调用的实现.在编译时,编译器将LINQ表达式(LINQ to object)转换成方法调用. .Net基础类库提供了两种扩展方法.S ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- 增强 Stream 接口的 distinct 方法的一些思考
遇到的问题 Java 8 开始引入了 Stream, 其中的 api 一直在不断的优化更新完善,Java 9 中更是引入了 ofNullable 还有 takeWhile 和 dropWhile 这两 ...
- 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )
文章目录 一.Groovy 扩展方法引入 二. 分析 Groovy 中 Thread 类的 start 扩展方法 一.Groovy 扩展方法引入 Groovy 可以对 JDK 中的一些类进行 方法扩展 ...
- LINQ中ForEach方法的使用
标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载.LINQ中For ...
- 循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
最新文章
- 类脑量子叠加脉冲神经网络:从量子大脑假说到更好的人工智能
- Linux环境准备20160921
- 【原创】DevExpress控件GridControl中的布局详解
- 接口api全局挂载_第 6 篇:分页接口
- mysql与web服务器之间的分离操作
- SDNU 1507.E.The Binding of Isaac
- [转]我是如何走进黑客世界的?
- lamp mysql5.0_CentOS 5/6 LAMP(Apache MySQL PHP)一键安装脚本
- 图解ThreadLocal核心原理
- Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
- POJ3253 Fence Repair【哈夫曼树+优先队列】
- 【2020团体程序设计天梯赛】L2部分(PTA,L2-033到L2-036)题解代码复盘
- linux shell脚本读取配置文件 val=1,shell脚本
- ubuntu MySQL数据库输入中文乱码 解决方案
- 小米max刷鸿蒙,小米Max刷recovery教程_小米Max第三方recovery下载
- 时间管理-番茄工作法
- QTcpSocket的使用步骤
- excel的图表里如何添加上下标
- 主动扫描技术nmap详解
- 51 nod 1682 中位数计数