咨询区

  • 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() ?相关推荐

  1. 技术动态 | 针对复杂问题的知识图谱问答最新进展

    本文转载自公众号:PaperWeekly. 作者:付彬.唐呈光.李杨.余海洋.孙健 单位:阿里巴巴达摩院小蜜Conversational AI团队 背景介绍 知识图谱问答(KBQA)利用图谱丰富的语义 ...

  2. 加载oracle属性文件,关于属性文件的详细介绍

    我们通常会将Java应用的配置参数保存在属性文件中,Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件,也可以是XML文件. 在本案例中,將会向大家介 ...

  3. php中的method是什么意思,HTML中的form标签的method属性怎么用?这里有method属性的用法介绍...

    本篇文章主要的介绍了关于HTML中的form标签的method属性的定义及其用法解释,做了详细的解释,后面还有两个常见的问答和method属性的实例,现在就让我们一起看下去吧 首先我们来看看HTML中 ...

  4. 针对复杂问题的知识图谱问答最新进展

    作者|付彬.唐呈光.李杨.余海洋.孙建 单位|阿里巴巴达摩院小蜜Conversational AI团队 背景介绍 知识图谱问答(KBQA)利用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近 ...

  5. 万能的小镇市场能否成为悟空问答的救命良药?

    上帝为你关上一扇门,同时还会为你打开一扇窗. 一二线大城市虽然较三四线城市和农村在经济.教育.人才和社会福利等方面领先,但是上帝还是公平的,近年来一二线大城市的消费增长缓慢,反观三四线城市和部分农村市 ...

  6. 知识图谱问答 | (1) 针对复杂问题的知识图谱问答(KBQA)最新进展

    原文地址 1. 背景介绍 知识图谱问答(KBQA)利用图谱丰富的语义关联信息,能够深入理解用户问题并给出答案,近年来吸引了学术界和工业界的广泛关注.KBQA 主要任务是将自然语言问题(NLQ)通过不同 ...

  7. 回港二次上市,会是内容社区平台的更优选吗?

    文|螳螂观察 作者| 叶小安 决定社区成败的是用户与内容,但决定平台存活的却是商业化.5300万内容创作者,和创作者贡献的4.59亿条内容,构成了知乎难以逾越的护城河:然而在商业化变现一事上,知乎依旧 ...

  8. SQL语句快速回忆——SQL基础知识点汇总

    文章目录 DDL 建表 约束 已经建了表要添加约束 取消主键PRIMARY约束 外键 FOREIGN KEY 建表时加外键(表2必须已经创建,并且建表时列名已经定义) 已有表添加外键约束 删除外键约束 ...

  9. SQL 常用数据类型汇总

    字符串类: CHAR(N),CHARACTER(n) 字符/字符串.固定长度 n. VARCHAR(n),CHARACTER VARYING(n) 字符/字符串.可变长度.最大长度 n.数字类: BI ...

最新文章

  1. [LeetCode] Longest Palindromic Substring
  2. AI产业智能化白皮书 | 清华x百度:全面解读AI产业化的现在和未来(附下载)...
  3. 启明去端分享| ESP32-S3如何实现tcp_client和tcp_server9-07
  4. js 字符串替换的问题
  5. 如何查询SAP Cloud for Customer系统升级和维护时间
  6. 零基础学习java------day11------常用API
  7. 美媒:小米新浪达成合作 采取行动对抗腾讯
  8. 已知斜边和角度求邻边_从数学史角度看数系发展
  9. Linux 启动顺序
  10. OAuth2 授权码模式为什么不直接返回access_token
  11. Windows Phone开发(25):启动器与选择器之WebBrowserTask 转:http://blog.csdn.net/tcjiaan/article/details/7404770...
  12. 通达信手机版分时图指标大全_手机炒股神器通达信公式手机版安装方法
  13. Android统计图表MPAndroidChart
  14. Fixture证书权限导致CSR申请证书失败的问题 [已解决]
  15. java输出26个字母_Java语言:输出26个英文字母(从键盘输入)
  16. 通过API接口快速根据关键词获取拼多多商品列表
  17. css样式表诞生,[css]简明教程 CSS样式表概述
  18. 编译PX4时,报错error ‘i‘ does not name a type __ULong i[2];解决方法
  19. 腾讯云轻量服务器在线安装MySQL
  20. PS初学——基本图像模式与调整(二)

热门文章

  1. WPF DataGrid根据内容设置行颜色
  2. web框架之Django(一)
  3. Android Button监听的方式
  4. jquery send(data) 对data的处理
  5. mysql在linux下修改存储路径
  6. IE6下margin-left双倍bug问题
  7. Oracle9i卸载后再次安装,设置的SID相同出现“指定的SID在本机上已经存在。请指定一个不同的SID。”...
  8. mysql 表数据转储_在MySQL中仅将表结构转储到文件中
  9. 如何在Chrome中保存您当前的所有标签,以便以后阅读
  10. kbone-cli初始化项目,提示‘模板xx不存在’