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();

Linq的Distinct方法相关推荐

  1. Linq的Distinct方法的扩展

    为什么80%的码农都做不了架构师?>>>    原文地址:如何很好的使用Linq的Distinct方法 Person1: Id=1, Name="Test1" P ...

  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. LINQ中ForEach方法的使用

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

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

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

  6. mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...

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

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

  8. LinQ—高级查询方法

    对于高级查询方法,主要分为五大类,详情下图: [Distinct]:  避免重复值出现,也就是如果有两个数字2,那么使用集合类可以单一出现 首先我们来写一个数组,方便举例: // 数组数据person ...

  9. Linq 的使用方法

    LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感 ...

最新文章

  1. 一文读懂因果推断的起源
  2. centos刻录工具_centos u盘引导制作工具下载|
  3. 计算机英语心得体会200字,英语读后感200字精选3篇
  4. 在MFC里面实现线程的实例
  5. linux标准I/O——格式化输出
  6. 使用solrj和EasyNet.Solr进行原子更新
  7. css3毛玻璃效果白边问题
  8. 让C# Excel导入导出,支持不同版本的Office
  9. 转摘:工厂方法模式(Factory Method Pattern)
  10. .net EventHandler 事件处理
  11. 火车进出站(POJ1363)
  12. 百度飞桨螺旋桨赋能生物医药,推动AI技术在药物研发领域的探索应用
  13. crc循环冗余校验码c语言,CRC循环冗余校验码的生成
  14. 回车键为什么叫做回车键?
  15. 小白怎么学习云计算?2020最新云计算学习路线图
  16. 一个java程序员看待互联网行业与物联网行业的区别
  17. Python 基于透明元素裁切图片(类似Photoshop)
  18. LINGO编程(基础)
  19. 细谈微商分销系统开发对企业的发展是好还是坏
  20. Urule Pro 普通决策表的应用,Excel导入决策表

热门文章

  1. 什么是Watchdog?
  2. serverlet总结
  3. B端产品客户画像的一点感悟
  4. 世界计算机科学大会,【计算机视觉】世界三大顶级会议介绍
  5. toFixed() is not a function toFixed方法数字类型才能使用
  6. 轮盘赌算法原理(ACO算法概率选择方法)
  7. 华为v3鸿蒙系统_安卓系统:鸿蒙系统,正式再见
  8. STM32F103xx TFT液晶显示ASCII字符串、中文、图片并且显示带有镜像和旋转功能
  9. http409 415报错原因
  10. 国产化替代加速升温,智和信通着力信创技术再迎突破