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进行了过滤
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity集成Wwise并进行开发

1. 背景 项目要接入WWise&#xff0c;学习一下 1.1 与Unity自带音频系统的区别 Unity有自己的原生音乐功能&#xff1a;AduioSound。但是这个功能较为简单&#xff0c;对于音效开发人员来说并不是很友好。在一些大型的游戏中&#xff0c;音效会接入Wwise这个软件。音效开发者…

如何绕过IP禁令

网站、游戏和应用程序可以屏蔽特定IP地址&#xff0c;从而阻止使用该IP地址的任何人访问其服务。这称为IP禁令。管理员可以出于多种原因&#xff08;例如发出过多请求或可疑活动&#xff09;屏蔽IP地址。但是&#xff0c;这些禁令会使收集数据或访问在线内容变得更加困难。 一…

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期 系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.9 解决方案 由官方提供SQL脚本代码如下: /*rollback120.sql - for Release 12.X only(based on r…

分布式 分布式事务 总结

前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言&#xff0c;一次完整的交易需要同时调动两个节…

部署GitLab服务器

文章目录 环境准备GitLab部署GitLab服务器GitLab中主要的概念客户端上传代码到gitlab服务器CI-CD概述软件程序上线流程安装Jenkins服务器 配置jenkins软件版本管理配置jenkins访问gitlab远程仓库下载到子目录部署代码到web服务器自动化部署流程 配置共享服务器配置jenkins把git…

kubeadm安装K8s集群之基础环境配置

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群基础环境配置 1.首先确保所有机器可以通信&#xff0c;然后配置主机host…

海康威视摄像头RTSP使用nginx推流到服务器直播教程

思路&#xff1a; 之前2020年在本科的时候&#xff0c;由于项目的需求需要将海康威视的摄像头使用推流服务器到网页进行直播。这里将自己半个月琢磨出来的步骤给大家发一些。切勿转载&#xff01;&#xff01;&#xff01;&#xff01; 使用网络摄像头中的rtsp协议---------通…

GLM-4V-Flash:智谱AI引领多模态视觉模型新潮流

点击访问 chatTools 免费体验GPT最新模型&#xff0c;包括o1推理模型、GPT4o 和Claude等模型&#xff01; 随着人工智能技术的不断进步&#xff0c;多模态模型逐渐成为行业关注的焦点。智谱AI作为国内领先的人工智能公司&#xff0c;再次以创新姿态推出了首款免费多模态视觉模型…

头歌 计算机操作系统 Linux之线程同步二

第1关&#xff1a;信号量 任务描述 在上一个实训中&#xff0c;我们学习了使用互斥锁来实现线程的同步&#xff0c;Linux系统中还提供了另一个类似互斥锁的线程不同操作&#xff0c;那就是信号量。 本关任务&#xff1a;学会使用信号量来实现线程间的同步与互斥。 相关知识 …

WADesk 升级 Webpack5 一些技术细节认识5和4的区别在哪里

背景 升级过程中发现有很多新的知识点&#xff0c;虽然未来可能永远都不会再遇到&#xff0c;但是仍然是一次学习的好机会&#xff0c;可以让自己知道&#xff0c;打包软件的进化之路&#xff0c;和原来 Webpack 4 版本的差异在哪里。 移除的依赖记录 babel/register: 在 Nod…

unity打包web,如何减小文件体积,特别是 Build.wasm.gz

unity打包WebGL&#xff0c;使用的是wasw&#xff0c;最终生成的Build.wasm.gz体积很大&#xff0c;有6.5M&#xff0c;有几个方法可以稍微减小这个文件的大小 1. 裁剪引擎代码&#xff1a; 此步可将大小从6.5减小到 6.2&#xff08;此项默认开启&#xff0c;只是改了裁剪等级…

敏捷开发04:Scrum 中的 Product Backlog(产品待办列表) 详细介绍

Product Backlog 产品待办列表 在计划开发产品功能时&#xff0c;都希望产品功能上线后&#xff0c;用户能够喜欢并经常使用。 因此在开发产品新功能时&#xff0c;就要衡量哪些产品需求是对用户最有价值&#xff0c;这是最应该思考的问题。 然后把这些有价值的需求集合放在一…

C# 探险之旅:第一节 - 我的第一个C# 程序

说明&#xff1a;教程针对初学者入门到精通的整个教程&#xff0c;采用连载的方式&#xff0c;会不定时更新。时间多的话可能会更新多一些。 一、首先&#xff0c;我们需要去微软官方下载vs2022安装程序&#xff0c;然后在自己的计算机中安装完编程的IDE程序。 二、假设我们已…

Ubuntu24.04配置STMTrack

项目地址&#xff1a;https://github.com/fzh0917/STMTrack 一、安装 CUDA 参考链接&#xff1a; Ubuntu24.04配置DINO-Tracker Ubuntu多CUDA版本安装及切换 由于之前在其他项目中已经安装了 CUDA12.1&#xff0c;这次需要安装另一个版本。 1. 查看安装版本 按照 requireme…

Luckysheet 实现 excel 多人在线协同编辑(全功能实现增强版)

前言 感谢大家对 Multi person online edit(多人在线编辑器) 项目的支持&#xff0c;mpoe 项目使用 quill、luckysheet、canvas-editor 实现的 md、excel、word 在线协同编辑&#xff0c;欢迎大家Fork 代码&#xff0c;多多 Start哦~ Multi person online edit 多人协同编辑器…

workflow笔记

workflow 介绍 搜狗公司C服务器引擎&#xff0c;编程范式。支撑搜狗几乎所有后端C在线服务&#xff0c;包括所有搜索服务&#xff0c;云输入法&#xff0c;在线广告等&#xff0c;每 日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引擎&#xff0c;可以满足大多数后端与…

【Vulkan入门】09-CreateFrameBuffer

目录 先叨叨git信息关键代码VulkanEnv::FindHostVisitbaleMemoryTypeIndex()TestPipeLine::CreateFramebuffers() 与网上大多数文章不同&#xff0c;其他文章基本上都使用窗口框架&#xff08;X11、GLFW、WSL等&#xff09;提供的surface来显示Vulkan渲染出的图像。我认为那样会…

【人工智能】5G-A技术及应用

文章目录 前言一、5G-A基本概念及产业进展1、5G-A概述2、移动通信发展历史&#xff1a;不断扩大联结规模&#xff0c;扩展业务边界的过程3、标准Ready:首版本R18将于2024年H1冻结4、标准Ready:IMT2020完成5G-A技术测试5、频谱Ready:超大带宽是实现万兆体验的基础6、5G-A全球商用…

与 Cursor AI 对话编程:2小时开发报修维修微信小程序

本文记录了如何通过与 Cursor AI 对话&#xff0c;全程不写一行代码的情况下&#xff0c;完成一个完整的报修小程序。整个过程展示了 AI 如何帮助我们&#xff1a; 生成代码 、解决问题、优化实现、完善细节。 先看一下效果图&#xff1a; 一、项目配置 首先我是这样和 AI 对…

多模态大语言模型 MLLM 部署微调实践

1 MLLM 1.1 什么是 MLLM 多模态大语言模型&#xff08;MultimodalLargeLanguageModel&#xff09;是指能够处理和融合多种不同类型数据&#xff08;如文本、图像、音频、视频等&#xff09;的大型人工智能模型。这些模型通常基于深度学习技术&#xff0c;能够理解和生成多种模…