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
NET问答: 如何按属性进行 Distinct() ?相关推荐
- 技术动态 | 针对复杂问题的知识图谱问答最新进展
本文转载自公众号:PaperWeekly. 作者:付彬.唐呈光.李杨.余海洋.孙健 单位:阿里巴巴达摩院小蜜Conversational AI团队 背景介绍 知识图谱问答(KBQA)利用图谱丰富的语义 ...
- 加载oracle属性文件,关于属性文件的详细介绍
我们通常会将Java应用的配置参数保存在属性文件中,Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件,也可以是XML文件. 在本案例中,將会向大家介 ...
- php中的method是什么意思,HTML中的form标签的method属性怎么用?这里有method属性的用法介绍...
本篇文章主要的介绍了关于HTML中的form标签的method属性的定义及其用法解释,做了详细的解释,后面还有两个常见的问答和method属性的实例,现在就让我们一起看下去吧 首先我们来看看HTML中 ...
- 针对复杂问题的知识图谱问答最新进展
作者|付彬.唐呈光.李杨.余海洋.孙建 单位|阿里巴巴达摩院小蜜Conversational AI团队 背景介绍 知识图谱问答(KBQA)利用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近 ...
- 万能的小镇市场能否成为悟空问答的救命良药?
上帝为你关上一扇门,同时还会为你打开一扇窗. 一二线大城市虽然较三四线城市和农村在经济.教育.人才和社会福利等方面领先,但是上帝还是公平的,近年来一二线大城市的消费增长缓慢,反观三四线城市和部分农村市 ...
- 知识图谱问答 | (1) 针对复杂问题的知识图谱问答(KBQA)最新进展
原文地址 1. 背景介绍 知识图谱问答(KBQA)利用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近年来吸引了学术界和工业界的广泛关注.KBQA 主要任务是将自然语言问题(NLQ)通过不同 ...
- 回港二次上市,会是内容社区平台的更优选吗?
文|螳螂观察 作者| 叶小安 决定社区成败的是用户与内容,但决定平台存活的却是商业化.5300万内容创作者,和创作者贡献的4.59亿条内容,构成了知乎难以逾越的护城河:然而在商业化变现一事上,知乎依旧 ...
- SQL语句快速回忆——SQL基础知识点汇总
文章目录 DDL 建表 约束 已经建了表要添加约束 取消主键PRIMARY约束 外键 FOREIGN KEY 建表时加外键(表2必须已经创建,并且建表时列名已经定义) 已有表添加外键约束 删除外键约束 ...
- SQL 常用数据类型汇总
字符串类: CHAR(N),CHARACTER(n) 字符/字符串.固定长度 n. VARCHAR(n),CHARACTER VARYING(n) 字符/字符串.可变长度.最大长度 n.数字类: BI ...
最新文章
- [LeetCode] Longest Palindromic Substring
- AI产业智能化白皮书 | 清华x百度:全面解读AI产业化的现在和未来(附下载)...
- 启明去端分享| ESP32-S3如何实现tcp_client和tcp_server9-07
- js 字符串替换的问题
- 如何查询SAP Cloud for Customer系统升级和维护时间
- 零基础学习java------day11------常用API
- 美媒:小米新浪达成合作 采取行动对抗腾讯
- 已知斜边和角度求邻边_从数学史角度看数系发展
- Linux 启动顺序
- OAuth2 授权码模式为什么不直接返回access_token
- Windows Phone开发(25):启动器与选择器之WebBrowserTask 转:http://blog.csdn.net/tcjiaan/article/details/7404770...
- 通达信手机版分时图指标大全_手机炒股神器通达信公式手机版安装方法
- Android统计图表MPAndroidChart
- Fixture证书权限导致CSR申请证书失败的问题 [已解决]
- java输出26个字母_Java语言:输出26个英文字母(从键盘输入)
- 通过API接口快速根据关键词获取拼多多商品列表
- css样式表诞生,[css]简明教程 CSS样式表概述
- 编译PX4时,报错error ‘i‘ does not name a type __ULong i[2];解决方法
- 腾讯云轻量服务器在线安装MySQL
- PS初学——基本图像模式与调整(二)
热门文章
- WPF DataGrid根据内容设置行颜色
- web框架之Django(一)
- Android Button监听的方式
- jquery send(data) 对data的处理
- mysql在linux下修改存储路径
- IE6下margin-left双倍bug问题
- Oracle9i卸载后再次安装,设置的SID相同出现“指定的SID在本机上已经存在。请指定一个不同的SID。”...
- mysql 表数据转储_在MySQL中仅将表结构转储到文件中
- 如何在Chrome中保存您当前的所有标签,以便以后阅读
- kbone-cli初始化项目,提示‘模板xx不存在’