为什么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方法的扩展相关推荐

  1. 如何很好的使用Linq的Distinct方法

    Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...

  2. Linq的Distinct方法

    Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...

  3. 【C#】详解使用Enumerable.Distinct方法去重

    Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法 ...

  4. 【More Effective C#】LINQ表达式与方法调用的映射

    LINQ构建在两个概念之上,一种查询语言和一系列将查询语言转换成方法调用的实现.在编译时,编译器将LINQ表达式(LINQ to object)转换成方法调用. .Net基础类库提供了两种扩展方法.S ...

  5. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  6. 增强 Stream 接口的 distinct 方法的一些思考

    遇到的问题 Java 8 开始引入了 Stream, 其中的 api 一直在不断的优化更新完善,Java 9 中更是引入了 ofNullable 还有 takeWhile 和 dropWhile 这两 ...

  7. 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )

    文章目录 一.Groovy 扩展方法引入 二. 分析 Groovy 中 Thread 类的 start 扩展方法 一.Groovy 扩展方法引入 Groovy 可以对 JDK 中的一些类进行 方法扩展 ...

  8. LINQ中ForEach方法的使用

    标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载.LINQ中For ...

  9. 循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

    循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

最新文章

  1. 类脑量子叠加脉冲神经网络:从量子大脑假说到更好的人工智能
  2. Linux环境准备20160921
  3. 【原创】DevExpress控件GridControl中的布局详解
  4. 接口api全局挂载_第 6 篇:分页接口
  5. mysql与web服务器之间的分离操作
  6. SDNU 1507.E.The Binding of Isaac
  7. [转]我是如何走进黑客世界的?
  8. lamp mysql5.0_CentOS 5/6 LAMP(Apache MySQL PHP)一键安装脚本
  9. 图解ThreadLocal核心原理
  10. Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
  11. POJ3253 Fence Repair【哈夫曼树+优先队列】
  12. 【2020团体程序设计天梯赛】L2部分(PTA,L2-033到L2-036)题解代码复盘
  13. linux shell脚本读取配置文件 val=1,shell脚本
  14. ubuntu MySQL数据库输入中文乱码 解决方案
  15. 小米max刷鸿蒙,小米Max刷recovery教程_小米Max第三方recovery下载
  16. 时间管理-番茄工作法
  17. QTcpSocket的使用步骤
  18. excel的图表里如何添加上下标
  19. 主动扫描技术nmap详解
  20. 51 nod 1682 中位数计数

热门文章

  1. 真5G尚需时日,滑稽的假5G营销已经上演
  2. Hadoop学习笔记—14.ZooKeeper环境搭建
  3. 纯 js 让浏览器不缓存 ajax 请求
  4. MySQL Replication主主复制—(实例)
  5. 洛谷——P1657 选书
  6. sqlDevelopor客户端操作MySQL数据库
  7. From NSURLConnection to NSURLSession
  8. 装好XP,打开SATA开机蓝屏解决方法
  9. Windows平台内核级文件访问
  10. LayaAir引擎开发HTML5最简单教程(面向JS开发者)