NET问答: 如何按属性进行 Distinct() ?

咨询区

  • Patrick Desjardins

我现在正在学习 LINQ,对一个简单类型的 List 进行 Distinct() 是非常简单的,如 List<int>List<string>,但如果对复杂类型 List<T> 的某一个或者多个属性进行 Distinct() 的话,该如何做呢?

比如下面的 Person 类:

public class Person{public int Id { get; set; }public string Name { get; set; }}

List<Person> 内容如下。


Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

现在我如何通过 ID 对 List<Person> 进行去重呢?最终我想要的结果是: person1 和 person3。

回答区

  • Amy B

如果你想对 Person 中的一个或者多个属性进行去重,很简单,可以对它们进行分组,然后在每个组上选择一个 赢家 即可。


List<Person> distinctPeople = allPeople.GroupBy(p => p.PersonId).Select(g => g.First()).ToList();

如果基于多个属性进行去重,可以使用 匿名类型


List<Person> distinctPeople = allPeople.GroupBy(p => new {p.PersonId, p.FavoriteColor} ).Select(g => g.First()).ToList();

  • Jon Skeet

如果你想实现 distinct-by 的效果,其实自己实现一个就可以了,写起来也非常简单。


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 属性进行去重了。


var query = people.DistinctBy(p => p.Id);

如果是基于多个属性的话,使用合适的 匿名类型


var query = people.DistinctBy(p => new { p.Id, p.Name });

点评区

其实 distinct-by 是一个非常实用的功能,原生的 Linq 不提供支持还是有点可惜的, 我记得以前为了实现此功能还特意让 实现 IEquatable 接口实现类型自定义,代码如下:

public class Person : IEquatable<Person>{public int Id { get; set; }public string Name { get; set; }public bool Equals(Person other){throw new NotImplementedException();}}

对了,如果你觉得 Linq 用的不够爽,可以使用第三方的 Linq 扩展版:MoreLinq,官方地址:https://github.com/morelinq/MoreLINQ

原文链接:https://stackoverflow.com/questions/489258/linqs-distinct-on-a-particular-property

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html站点如何命名,html页面的CSS、DIV命名规则

68. XHTML文件中id的命名(1)页面结构容器: container页头&#xff1a;header内容&#xff1a;content/container页面主体&#xff1a;main页尾&#xff1a;footer导航&#xff1a;nav侧栏&#xff1a;sidebar栏目&#xff1a;column页面外围控制整体布局宽度&#xff1a;wra…

2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ

1选课须知1. 研究生选课系统什么时间开放&#xff1f; 答&#xff1a;2020年春季学期研究生选课系统开放时间为&#xff1a;2020年2月19日(周三)10:00至2020年3月9日(周一)10:00。2020年3月9日(周一)10:00后&#xff0c;研究生可以在选课系统中查询课表、已选课程、学分获得情况…

如何从零开始构建深度学习项目?这里有一份详细的教程

导读&#xff1a;在学习了有关深度学习的理论之后&#xff0c;很多人都会有兴趣尝试构建一个属于自己的项目。本文将会从第一步开始&#xff0c;告诉你如何解决项目开发中会遇到的各类问题。本文由六大部分组成&#xff0c;涵盖深度学习 ( DL ) 项目的整个过程。我们将使用一个…

性能分布式NewLife.XCode对无限数据的支持

上周发布了《改进版CodeTimer及XCode性能测试》&#xff0c;展示了NewLife.XCode在性能上的表现。实际上NewLife.XCode是一个很平凡的ORM&#xff0c;只是在分页和缓存方面多下点功夫&#xff0c;注意每一个细节&#xff0c;才能保证在数据量大、业务繁忙的环境中得以保持良好的…

C#实用小知识:string和判断null

stringstring是常用的类型&#xff0c;它具有不可变性&#xff1a;就是一旦赋值&#xff0c;就不可变&#xff0c;如果再赋值 &#xff0c;就重新开辟内存空间&#xff1b;保留性&#xff1a;如果一个字符串存在&#xff0c;另一个与其相同&#xff0c;他们会指向同一个地址&am…

s6730堆叠_不再只是堆叠硬件 ivvi S6全方位评测

【PConline 评测】ivvi是酷派公司的又一个全新的子品牌&#xff0c;与旗下的电商品牌“大神”相比&#xff0c;ivvi的定位更为高端&#xff0c;动用酷派公司的顶级资源打造&#xff0c;通过线上线下一体销售。在机身做工设计与硬件选用方面ivvi尽善尽美&#xff0c;集合了酷派手…

.net html5页面缓存,详解HTML5中的manifest缓存使用

起源html5之前的网页&#xff0c;都是无连接&#xff0c;必须联网才能访问&#xff0c;这其实也是web的特色&#xff0c;这其实对于PC是时代问题并不大&#xff0c;但到了移动互联网时代&#xff0c;设备终端位置不再固定&#xff0c;依赖无线信号&#xff0c;网络的可靠性变得…

机器学习的最佳学习路线原来只有四步

AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。在机器学习领域&#xff0c;Python已经成为了主流。一方面因为这门语言简单易上手&#x…

AutoCAD VBA基于对象的分层

AutoCAD VBA基于对象的分层&#xff0c;讲不同对象根据特性分层&#xff0c;代码如下。 Dim Value As Variant Value ThisDrawing.GetVariable("cmdecho") ThisDrawing.SetVariable "cmdecho", 0 Dim ObjLayer As AcadLayer Set ObjLayer ThisDrawing.La…

ASP.NET Core Filter如何支持依赖注入

概述通过使用 ASP.NET Core 中的筛选器&#xff0c;可在请求处理管道中的特定阶段之前或之后运行代码。内置筛选器处理任务&#xff0c;例如&#xff1a;授权&#xff08;防止用户访问未获授权的资源&#xff09;。响应缓存&#xff08;对请求管道进行短路出路&#xff0c;以便…

做流向图_各类型供热暖系统图大全,一饱眼福!

↑ 点击上方“暖通风向标”关注我们推广.暖通风向标本文来源&#xff1a;制冷网好书推荐做热泵这几本书你不得不看&#xff01;区域供热系统热电联产系统地热水供暖系统即热式生活热水系统即热式特点:可保证用户随时随地均有热水供应&#xff0c;系统紧凑&#xff0c;无需储罐&…

怎样和程序猿谈一场不散场的爱情

这篇文章就教你如何优&#xff08;xin&#xff09;雅&#xff08;ji&#xff09;的驯服程序猿男友。先分享2个网友的养猿故事。对于程序员&#xff0c;大家想必会有这么一个印象&#xff1a;生活简单乏味&#xff0c;除了编程、吃饭、睡觉&#xff0c;就是上网、打游戏或者一副…

ITU-R BT.656 协议

ITU-R BT.601和ITU-R BT.656国际电信联盟&#xff08;International Telecommunication Union&#xff09;无线通信部门&#xff08;ITU-R&#xff09;制定的标准。严格来说&#xff0c;ITU-R BT.656应该是隶属ITU-R BT.601的一个子协议。ITU-R BT.601是演播室数字电视编码参数…

html下拉菜单的子目录,html - 带有下拉菜单的子菜单的垂直下拉菜单 - 堆栈内存溢出...

我想用以下结构制作一个垂直下拉菜单(对于每个“按钮”一个不同的“下拉” div)。这个想法是当我将“按钮”悬停时&#xff0c;“下拉”以相同的方式出现在“按钮”上大小 (“下拉列表”缩小为高度“ subnav1”相等的“按钮”大小)或显示在“下拉列表”的左侧 (再次具有“ subn…

一年增加1.2w星,Dapr能否引领云原生中间件的未来?

作者 | 敖小剑Dapr 将引领云原生时代应用和中间件的未来。Dapr 是由微软发起的云原生开源新项目&#xff0c;在今年 2 月份刚刚发布了 v1.0 正式版本。虽然推出至今不过一年半时间&#xff0c;但 Dapr 发展势头十分迅猛&#xff0c;目前已经在 GitHub 上收获了 1.2w 星。阿里是…

kylin如何支持flink_日均万亿条数据如何处理?爱奇艺实时计算平台这样做

1.爱奇艺 Flink 服务现状爱奇艺从 2012 年开始开展大数据业务&#xff0c;一开始只有二十几个节点&#xff0c;主要是 MapReduce、Hive 等离线计算任务。到 2014 年左右上线了 Storm、Spark 实时计算服务&#xff0c;并随后发布了基于 Spark 的实时计算平台 Europa。2017 年开始…

VI3的VLAN配置:VST、EST和VGT标记

VMware专家谈及在VMware Infrastructure(VI3)中使用虚拟LAN&#xff08;VLAN&#xff09;时&#xff0c;他们通常是指VLAN Trunk的使用。不过&#xff0c;VI3使用的VLAN配置还有其他三种类型&#xff1a;Virtual Switch Tagging&#xff08;虚拟交换机标记&#xff0c;缩写VST …

没错,纯SQL查询语句可以实现神经网络

我们熟知的SQL是一种数据库查询语句&#xff0c;它方便了开发者在大型数据中执行高效的操作。但本文从另一角度嵌套SQL查询语句而构建了一个简单的三层全连接网络&#xff0c;虽然由于语句的嵌套过深而不能高效计算&#xff0c;但仍然是一个非常有意思的实验。在这篇文章中&…

html5 控制鼠标移动,HTML5 Canvas随鼠标移动的引力粒子群

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定use strict;// Initial Setupvar canvas document.querySelector(canvas);var c canvas.getContext(2d);canvas.width innerWidth;canvas.height innerHeight;// Variablesvar mouse {x: innerWidth / 2,y: inn…

茫茫内存,我该如何用 windbg 找到你 ?

一&#xff1a;背景 1. 讲故事前天wx上有个朋友丢给我一个dump&#xff0c;让我帮忙鉴定一下某些敏感信息在内存中是否也是加密的&#xff0c;现在数据安全很重要&#xff0c;不仅数据库中的信息要加密&#xff0c;灌到内存后数据同样也需密文存储&#xff0c;随用随解密&#…