使用Linq的Distinct方法

代码进行简单的分析:

  1. DistinctBy 方法:
  • 这个方法是一个泛型方法,参数包括 source(要去重的源集合)和 keySelector(用于选择去重的键的委托)。
  • 在方法内部,创建了一个 HashSet 对象 seenKeys,用于存储已经出现过的键。
  • 遍历源集合中的每个元素,通过 keySelector 获取元素的键,并尝试将键加入到 seenKeys 中。
  • 如果成功加入(即之前没有出现过),则返回当前元素,实现去重的效果。
  1. Distinct 方法:
  • 这个方法也是一个泛型方法,参数包括 source(要去重的源集合)和 comparer(用于比较元素是否相等的委托)。
  • 在方法内部,调用了另一个重载的 Distinct 方法,并传入一个实现了 IEqualityComparer<T> 接口的对象 DynamicEqualityComparer<T>
  • DynamicEqualityComparer<T> 类实现了 IEqualityComparer<T> 接口,根据传入的比较委托来判断两个元素是否相等。
  • 在 Equals 方法中,通过调用传入的比较委托来判断两个元素是否相等。
  • 在 GetHashCode 方法中,简单地返回了固定的哈希码 0,因为在这里并不需要真正的哈希码。
/// <summary> /// list = list.Distinct(d => new { d.Age, d.Name }).ToList();/// </summary> /// <typeparam name="TSource"></typeparam> /// <typeparam name="TKey"></typeparam> /// <param name="source"></param> /// <param name="keySelector">p => new { p.ID, p.Name }</param> /// <returns></returns> 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;}}}/// <summary>/// 数据较大时使用此方法 list = list.Distinct((a, b) => a.Age == b.Age && a.Name == b.Name).ToList();/// </summary>/// <typeparam name="T"></typeparam>/// <param name="source"></param>/// <param name="comparer"></param>/// <returns></returns>public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source, Func<T, T, bool> comparer)where T : class=> source.Distinct(new DynamicEqualityComparer<T>(comparer));private sealed class DynamicEqualityComparer<T> : IEqualityComparer<T>where T : class{private readonly Func<T, T, bool> _func;public DynamicEqualityComparer(Func<T, T, bool> func){_func = func;}public bool Equals(T x, T y) => _func(x, y);public int GetHashCode(T obj) => 0;}

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

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

相关文章

手撕C语言题典——逆序输出

有这样一个问题&#xff1a;读入一些整数&#xff0c;逆序输出到一行中。已知的是该整数不超过100个。我们该怎么办呢&#xff1f;我们先将这些整数循环输入&#xff0c;输入每个整数之后&#xff0c;我们只能将数组存下来&#xff0c;而这个地方就是数组。 本章可能用到的知识…

Python断言

Python断言 1 什么是Python断言2 使用场景3 常用断言函数 1 什么是Python断言 断言就是断定指定条件一定成立&#xff0c;若不成立则抛出异常。Python断言关键字为&#xff1a;assert&#xff0c;断言也可以理解为简单版的 if 语句&#xff0c;判断条件的值&#xff0c;若为Tr…

windows10装windows11的CMD(Terminal)终端

文章目录 一 前言二 安装Terminal三 启动设置成默认启动cmd 一 前言 我装了WSL的LINUX系统&#xff0c;在 windows10 系统下面不方便启动linux&#xff0c;但是Windows11 在cmd 里面就可以打开&#xff0c; 所以找了这个方法 二 安装Terminal 先在windows10微软的商城(Microso…

>>Vue3+pinia+echarts等实现疫情可视化大图

一.>>前言 1.这个项目是在小满实战篇可视化&#xff08;第九章-饼图&#xff09;_哔哩哔哩_bilibili 这一系列课程为基础来做的&#xff0c;真的很感谢小满老师&#xff0c;讲的内容干货满满&#xff0c;暂时解决了手上没有项目的难题。大家可以去观摩一下他的优质课程。…

什么是膨胀卷积/空洞卷积

什么是膨胀卷积/空洞卷积 膨胀卷积&#xff08;Dilated Convolution/Atrous Convolution&#xff09;&#xff08;下面都使用膨胀卷积 这个名词&#xff09; 先来一张图&#xff0c;让大家对于膨胀卷积有个直观的理解&#xff0c;上图左边就是普通卷积&#xff0c;右边是膨胀卷…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

网站出现错别字有什么影响?如何进行网站错别字检测?

在信息化时代&#xff0c;网站是企业乃至个人对外传播信息、展示形象以及提供服务的重要平台&#xff0c;其内容的准确性和规范性至关重要。但在实际业务场景中&#xff0c;由于种种原因&#xff0c;网站中经常会出现错别字&#xff0c;给网站的权威性和严谨性造成影响&#xf…

京东按图搜索京东商品(拍立淘) API 返回值说明

京东按图搜索商品&#xff08;拍立淘&#xff09;的API返回值包含了关于通过图片搜索到的京东商品的相关信息。由于我无法提供最新的京东API返回值的确切结构&#xff0c;以下是基于常见API设计原则的一个大致的返回值示例和说明&#xff1a; 调用链接获取详情 item_search_i…

MC10T1S-10BASE-T1S车载以太网转换器

10BASE-T1S车载以太网转换器 为10BASE-T1S车载以太网转换器&#xff0c;支持Multidrop bus line和Point-to-Point。采用的DB9接口类型&#xff0c;支持PLCA。10BASE-T1S是IEEE 802.3cg标准制定的IEEE汽车以太网的最新标准之一&#xff0c;采用UTP这样的一对无屏蔽的双芯电缆进行…

matlab simulink 电力系统同步发电机励磁系统的建模与仿真

1、内容简介 略 77-可以交流、咨询、答疑 电力系统同步发电机励磁系统的建模与仿真 建立MATLAB的同步发电机励磁调节系统仿真模型&#xff0c;最后建立了以PID和PSS为励磁控制方式的同步发电机励磁调节系统数学模型&#xff0c;在Simulink环境下进行了仿真&#xff0c;收到…

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据&#xff1f; 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云…

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日&#xff0c;LPL春季赛今天继续进行&#xff0c;今天将会迎来春季赛常规赛第八周第三个比赛日&#xff0c;今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队&#xff0c;今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的&#xff0c;目前三支战队都…

第十二届蓝桥杯省赛CC++ 研究生组-货物摆放

还是整数分解问题,注意n本身也是约数 #include <iostream> int main(){printf("2430");return 0; }#include <iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const ll n 2021041820210418LL…

QGIS开发笔记(一):QGIS介绍、软件下载和加载shp地图数据Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136888334 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

实现安卓连接阿里云物联网平台(2)

完整工程链接 链接&#xff1a;https://pan.baidu.com/s/1ykcJHPBSKBXVMaMWKoVRvA?pwd8888 提取码&#xff1a;8888 &#xff08;1&#xff09;创建一个新工程 &#xff08;2&#xff09;添加mqtt包的依赖 implementation org.eclipse.paho:org.eclipse.paho.client.mqttv…

MINT: Detecting Fraudulent Behaviors from Time-series Relational Data论文阅读笔记

2. 问题定义 时间序列关系数据&#xff08;Time Series Relation Data&#xff09; 这个数据是存放在关系型数据库中&#xff0c;每一条记录都是泰永时间搓的行为。 更具体地&#xff0c;每条记录表示为 x ( v , t , x 1 , x 2 , … , x m − 2 ) x (v,t,x_1,x_2,\dots,x…

【Unity】UI九宫格

什么是九宫格&#xff1f; 顾名思义&#xff0c;九宫格就是指UI切成9个格子&#xff0c;9个格子可以任意拉伸。 1、3、7、9不拉伸。 2、8水平拉伸。 4、6垂直拉伸。 5既可以水平也可以垂直拉伸。 怎么切九宫格&#xff1f; 选中图片&#xff0c;改成Sprite模式&#xff0c;点…

Spark面试整理-Spark的主要组件是什么?

Apache Spark由几个关键组件组成,这些组件共同构成了它强大的数据处理和分析能力。以下是Spark的主要组件: Spark Core:Spark Core是整个Spark平台的基础,提供了基本的I/O功能、任务调度、内存管理、错误恢复等功能。它引入了弹性分布式数据集(RDD),这是Spark的一个基本…

Linux 常用命令汇总(七):进程管理 系统权限 用户授权

一、进程管理命令 1.1 service 1.1.1 介绍 service 是一个在大多数 Linux 发行版中用于管理系统服务的命令 1.1.2 使用方法 sudo service 服务名 [start|stop|restart|status|...] 1.1.3 常见使用案例 1.1.3.1 启动服务 sudo service apache2 start 这将启动名为 apac…