C#开发-集合使用和技巧(十)Union用法-并集

在 C# 中,IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素,确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法:

基本语法

public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource>? comparer);

参数说明

  • first: 第一个序列。
  • second: 第二个序列。
  • comparer:自定义比较器

示例

简单示例

假设我们有两个整数集合,我们希望将它们合并成一个集合,并去除重复的元素。

var list1 = new List<int> { 1, 2, 3, 4, 5 };
var list2 = new List<int> { 4, 5, 6, 7, 8 };

使用 Union 方法

var unionList = list1.Union(list2);foreach (var item in unionList)
{Console.WriteLine(item);
}

输出

1
2
3
4
5
6
7
8

在这个示例中,Union 方法将 list1 和 list2 合并成一个新的集合 unionList,并且去除了重复的元素 4 和 5。

自定义类型

如果你有一个自定义类型,你可以通过重写 Equals 和 GetHashCode 方法来确保 Union 方法正确地识别重复元素。

定义示例类

定义一个Person类,有ID和Name,我们定义只有Id和Name都相同才表示是相同

public class Person
{public int Id { get; set; }public string Name { get; set; }public override bool Equals(object obj){if (obj is Person other){return Id == other.Id && Name == other.Name;}return false;}public override int GetHashCode(){return HashCode.Combine(Id, Name);}
}

测试数据

            var people1 = new List<Person>{new Person { Id = 1, Name = "丁一" },new Person { Id = 2, Name = "王二" },};var people2 = new List<Person>{new Person { Id = 2, Name = "王二" },new Person { Id = 3, Name = "张三" },};

使用 Union 方法

使用Union进行并集操作

var unionPeople = people1.Union(people2);
foreach (var person in unionPeople)
{Console.WriteLine($"Id: {person.Id}, Name: {person.Name}");
}

输出

可以看到过滤到了里面的重复对象
在这里插入图片描述

测试数据2

    var people1 = new List<Person>{new Person { Id = 1, Name = "丁一" },new Person { Id = 2, Name = "王二" },};var people2 = new List<Person>{new Person { Id = 2, Name = "王二1" },new Person { Id = 3, Name = "张三" },};

测试结果

可以看到名字不相同就没有过滤
在这里插入图片描述

注意事项

Union 方法默认使用元素的 Equals GetHashCode 方法来比较元素。

• 如果你需要自定义比较逻辑,可以使用 Union 的重载方法,该方法接受一个 IEqualityComparer 参数。

使用自定义比较器

在这个示例中,我们使用了一个自定义的 PersonComparer 来比较 Person 对象,确保 Union 方法根据 Id 进行比较。

使用自定义比较器进行 Union,创建一个自定义比较器PersonComparer 来比较,里面以Id为基准

public class PersonComparer : IEqualityComparer<Person>
{public bool Equals(Person x, Person y){if (x is null && y is null) return true;if (x is null || y is null) return false;return x.Id == y.Id;}public int GetHashCode(Person obj){return obj.Id.GetHashCode();}
}

然后使用Union进行比较

var customComparer = new PersonComparer();
var unionPeopleCustom = people1.Union(people2, customComparer);foreach (var person in unionPeopleCustom)
{Console.WriteLine($"Id: {person.Id}, Name: {person.Name}");
}

结果

根据比较器,只根据Id进行了过滤
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

高效查找的秘密武器二:布隆过滤器

最近学了这个布隆过滤器&#xff0c;所以小编来分享下这个神奇的数据结构 引入&#xff1a; 在我们日常生活中&#xff0c;当然这里特指是编程中时&#xff0c;经常遇到要判断一个元素是否在集合中&#xff0c;比如判断一个单词/词语&#xff0c;是否在已知的字典中&#xff1…

C++入门终

目录 一、引用 二、内联函数 三、auto关键字 四、指针空值nullptr 一、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 类型&引用变量名(对象名)…

C++实现排序算法:冒泡排序

目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后&#xff08;从后往前&#xff09;两两比较&#xff0c;若为逆序&#xff08;即arr[i] < arr[i 1]&#xff09;则交换…

selenium+python实现12306自动化抢火车票(二)

往期回顾&#xff1a; seleniumpython实现12306自动化抢火车票&#xff08;一&#xff09; 1、根据乘车人姓名匹配&#xff0c;支持1人或多人选择 定位出所有乘车人的元素集&#xff0c;根据姓名集合去元素集里循环迭代匹配&#xff0c;匹配上了操作选中 ele_alldriver.find_e…

基于openzeppelin插件的智能合约升级

一、作用以及优点 部署可升级合约&#xff0c;插件自动部署proxy和proxyAdmin合约&#xff0c;帮助管理合约升级和交互&#xff1b;升级已部署合约&#xff0c;通过插件快速升级合约&#xff0c;脚本开发方便快捷&#xff1b;管理代理管理员的权限&#xff0c;只有proxyAdmin的…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中&#xff0c;目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎&#xff0c;这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

MySQL-设置utf8mb4字符集以支持全面的字符显示

本文主要介绍如何通过统一使用utf8mb4字符集来实现在MySQL实例中存储emoji表情的最佳实践。 我们将从客户端、会话连接和MySQL实例等多个方面介绍如何配置和修改字符集以支持utf8mb4。 客户端和会话连接的字符集配置 为了确保能够正确存储和显示emoji表情&#xff0c;我们首…

【Linux从青铜到王者】数据链路层(mac,arp)以及ip分片

局域网通信 通过之前的学习&#xff0c;我们了解了应用层&#xff0c;传输层&#xff0c;网络层的协议和作用&#xff0c;这里先做个总结 应用层——http&#xff0c;https协议&#xff0c;也可以自己定义一套&#xff0c;作用是进行数据的处理传输层——tcp&#xff0c;udp协…

基于STM32的风速风向传感器设计

目录 引言系统设计 硬件设计软件设计系统功能模块 风速采集模块风向采集模块数据处理与显示模块控制算法 风速数据处理算法风向数据处理算法代码实现 风速数据采集与处理风向数据采集与处理数据显示与通信系统调试与优化结论与展望 1. 引言 随着气象监测需求的增加&#xff0…

13.在 Vue 3 中使用OpenLayers加载鹰眼控件示例教程

在 WebGIS 开发中&#xff0c;鹰眼控件 是一个常用的功能&#xff0c;它可以为用户提供当前地图位置的概览&#xff0c;帮助更好地定位和导航。在本文中&#xff0c;我们将基于 Vue 3 的 Composition API 和 OpenLayers&#xff0c;创建一个简单的鹰眼控件示例。 效果预览 在最…

安装certbot(ubuntu系统)

安装nginx 更新软件包列表 sudo apt update 更新软件包列表 sudo apt install nginx 更新软件包列表 sudo systemctl status nginx 注意&#xff1a;强烈推荐使用&#xff0c;系统直接安装nginx&#xff0c;&#xff08;不推荐使用docker安装nginx&#xff09;为后续更简单…

【C语言】C语言的变量和声明系统性讲解

声明和定义的概念 在C语言中&#xff0c;**声明&#xff08;Declaration&#xff09;和定义&#xff08;Definition&#xff09;**是两个重要的基础概念&#xff0c;它们都涉及到变量、函数、结构体等的使用&#xff0c;但功能和作用存在明显区别&#xff1a; 声明&#xff1a…

【Linux】文件的内核级缓冲区、重定向、用户级缓冲区(详解)

一.文件内核级缓冲区 在一个struct file内部还要有一个数据结构-----文件的内核级缓冲区 打开文件&#xff0c;为我们创建struct file&#xff0c;与该文件的所对应的操作表函数指针集合&#xff0c;还要提供一个文件的内核级缓冲区 1.write写入具体操作 当我们去对一个文件写…

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备&#xff1a;将其他信号转换为计算机可以识别的信号&#xff08;电信号&#xff09;。输出设备&#xff1a;将电信号&#xff08;&#xff10;、&#xff11;&#xff09;转为人或其他设备能理解的…

JDK8新特性之Stream流01

Stream 流介绍 目标 了解集合的处理数据的弊端 理解Stream流的思想和作用 集合处理数据的弊端 当我们需要对集合中的元素进行操作的时候&#xff0c;除了必须的添加&#xff0c;删除&#xff0c;获取外&#xff0c;最典型的就是遍历集合。我们来体验集合操作的弊端&#xff…

【C++】—— map 与 multimap

【C】—— map 与 multimap 1 map1.1 map 和 multimap 参考文档1.2 map 类的介绍1.3 pair 类型介绍1.4 map的构造1.5 map的插入1.5.1 map 的插入方法1.5.2 验证1.5.3 再探pair1.5.4 make_pair 1.6 operator[]1.6.1 样例1.6.2 认识operator[]1.6.3 operator[] 的功能 1.7 map 的…

VTK知识学习(20)- 数据的存储与表达

1、数据的存储 1)、vtkDataArray VTK中的内存分配采用连续内存&#xff0c;可以快速地创建、删除和遍历&#xff0c;称之为数据数组(DataArray)&#xff0c;用类 vtkDataArray 实现。数组数据的访问是基于索引的&#xff0c;从零开始计数。 以 vtkFloatArray 类来说明如何在 …

HCIP-以太网交换安全

端口隔离&#xff1a;实现同一VLAN下的不同用户在二层不能互通&#xff08;可以实现在三层互通&#xff09;&#xff0c;同一个隔离组内是相互隔离的&#xff0c; MAC地址表功能&#xff1a;动态MAC地址表项&#xff0c;接口通告报文中的源MAC地址学习获得&#xff0c;表项可老…

电机功率、电压与电流的换算方法

在电气工程和相关行业中&#xff0c;电机的功率、电压和电流是三个重要的基本参数。它们之间有着密切的关系&#xff0c;而理解这些关系对于电机的选型、设计和应用至关重要。本文将详细阐述这三者之间的换算关系&#xff0c;以及相关公式的应用。 一、电机功率的定义 电机功…

【CKS最新模拟真题】获取多个集群的上下文名称并保存到指定文件中

文章目录 前言一、TASK二、解题过程1、问题一解题2、问题二解题 前言 月底考CKS,这是最新版的CKS模拟题 环境k8s版本ubuntu1.31 一、TASK 题目要求 Solve this question on: ssh cks3477 You have access to multiple clusters from your main terminal through contexts. …