C# 如何比较两个List是否相等?

简介

C# 里,比较两个 List 是否相等,需要考虑多个方面,例如列表中的元素顺序、元素本身是否相等。下面介绍几种常见的比较方法:

基本类型比较(元素顺序必须一致)

var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3 };bool areEqual = list1.SequenceEqual(list2); // ✅ true

忽略顺序比较

var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 3, 2, 1 };bool areEqual = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x)); // ✅ true

或先分别排完序,再比较:

list3.Sort();
list4.Sort();
Console.WriteLine(list3.SequenceEqual(list4)); // 输出: True

复杂类型(自定义对象列表)

  • 实现 EqualsGetHashCode 方法
public class Person
{public string Name { get; set; }public int Age { get; set; }public override bool Equals(object? obj){if (obj is Person person){return Name == person.Name && Age == person.Age;}return false;}public override int GetHashCode(){return HashCode.Combine(Name, Age);}
}

使用:

Console.WriteLine(person1.SequenceEqual(person2)); // 输出: True
  • 自定义比较器:
public class Person
{public string Name { get; set; }public int Age { get; set; }
}
public class PersonComparer : IEqualityComparer<Person>
{public bool Equals(Person? x, Person? y){return x?.Name == y?.Name && x?.Age == y?.Age;}public int GetHashCode(Person obj){return HashCode.Combine(obj.Name, obj.Age);// 还有一种写法:// return obj.Name.GetHashCode() ^ obj.Age.GetHashCode();}
}

使用方式:

var list1 = new List<Person>
{new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 }
};var list2 = new List<Person>
{new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 }
};bool areEqual = list1.SequenceEqual(list2, new PersonComparer()); // ✅ true

判断是否完全包含对方(不关心顺序)

bool setEqual = list1.Count == list2.Count &&!list1.Except(list2).Any() &&!list2.Except(list1).Any();

使用 SetEquals(无序、无重复判断)

bool areEqual = new HashSet<int>(list1).SetEquals(list2);

或:

HashSet<int> set1 = new HashSet<int>(list3);
HashSet<int> set2 = new HashSet<int>(list4);bool isEqual = set1.SetEquals(set2);
Console.WriteLine(isEqual); // 输出: True

比较两个 null 列表

List<int>? list5 = null;
List<int>? list6 = null;
Console.WriteLine(list5 == list6); // 输出: True

比较两个包含null元素的列表

List<string?> list7 = new List<string?> { "a", null };
List<string?> list8 = new List<string?> { "a", null };
Console.WriteLine(list7.SequenceEqual(list8)); // 输出: True

性能优化建议

  • 小规模数据:使用 SequenceEqualHashSet

  • 大规模数据:

    • 先检查列表长度是否相同。
    • 使用并行化处理(如 AsParallel().SequenceEqual())。

总结

场景方法是否考虑顺序是否考虑重复次数
顺序敏感且内容相同SequenceEqual
顺序不敏感且内容相同HashSet.SetEquals
顺序不敏感但重复次数相同排序后使用 SequenceEqual
自定义对象比较重写 Equals 或使用 IEqualityComparer可配置可配置

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

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

相关文章

【技术派后端篇】Redis分布式锁:原理、实践与应用

在当今的高并发系统中&#xff0c;分布式锁是保障数据一致性和系统稳定性的重要手段。今天&#xff0c;我们就来深入探讨一下Redis分布式锁&#xff0c;揭开它神秘的面纱。 1 本地锁与分布式锁的区别 在Java开发的早期阶段&#xff0c;我们接触过synchronized和Lock锁&#x…

奥比中光tof相机开发学习笔记

针对奥比中光 tof相机&#xff0c;官方提供的资料如下ProcessOn Mindmap|思维导图 Orbbec SDK Python Wrapper基于Orbbec SDK进行设计封装&#xff0c;主要实现数据流接收&#xff0c;设备指令控制。下面就其开发适配进行如下总结&#xff1a; &#xff08;1&#xff09;系统配…

如何学习嵌入式

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.16 请各位前辈能否给我提点建议&#xff0c;或者学习路线指导一下 STM32单片机学习总…

2025 年蓝桥杯 Java B 组真题解析分享

今年是我第二次参加蓝桥杯软件类Java B组的比赛&#xff0c;虽然赛前做了不少准备&#xff0c;但真正坐在考场上时&#xff0c;还是有种熟悉又紧张的感觉。蓝桥杯的题目一向以“基础创新”著称&#xff0c;今年也不例外&#xff0c;每道题都考验着我们对算法的理解、代码实现能…

Vue3服务器端渲染深度实践:架构、性能与全栈集成

一、SSR架构设计模式 1.1 架构模式选择矩阵 维度CSRSSR混合渲染首次内容渲染(FCP)慢(依赖JS执行)快(HTML直出)按路由动态选择SEO支持需预渲染原生支持关键页预渲染服务端压力低(静态托管)高(实时渲染)使用缓存中间层TTI(可交互时间)受限于JS体积需等待Hydration渐进式激活适用…

2025年泰迪杯数据挖掘竞赛B题论文首发+问题一二三四代码分享

料 基于穿戴装备的身体活动监测 摘要 随着科技的进步&#xff0c;加速度计&#xff0c;能够实时、准确地捕捉人体的动态变化&#xff0c;成为医学应用中的一个重要工具。本文将基于题目收集数据进行相关研究。 针对题目给出的数据集&#xff0c;我们首先进行数据清洗工作。首…

国内AI搜索平台与ChatGPT横向对比分析

一、核心技术差异 1、‌百度文小言‌ 基于文心大模型4.0升级&#xff0c;主打“新搜索”能力&#xff0c;支持多模态输入&#xff08;语音、图片、视频&#xff09;和富媒体搜索结果‌。 独有的“记忆个性化”功能可结合用户历史行为优化回答&#xff0c;并在医疗、教育等垂直…

安卓环境搭建开发工具下载Gradle下载

1.安装jdk(使用java语言开发安卓app) 核心库 java.lang java.util java.sq; java.io 2.安装开发工具(IDE)android studio https://r3---sn-2x3elnel.gvt1-cn.com/edgedl/android/studio/install/2023.3.1.18/android-studio-2023.3.1.18-windows.exe下载完成后一步一步安装即…

Python 趣味学习 -数据类型脱口秀速记公式 [特殊字符]

&#x1f3a4; Python数据类型脱口秀速记公式 &#x1f40d; 1️⃣ 四大金刚登场 "Set叔(无序洁癖)、Tuple爷(顽固老头)、List姐(百变女王)、Dict哥(万能钥匙)"2️⃣ 特性对比RAP &#x1f3b6; 内存/作用域&#xff1a; 全局变量 → 函数内修改 → 可变(mutable)会…

单片机 | 基于51单片机的倾角测量系统设计

以下是一个基于51单片机的倾角测量系统设计详解,包含原理、公式和完整代码: 一、系统原理 核心器件:MPU6050(集成3轴加速度计+陀螺仪) 主控芯片:STC89C52RC(51单片机) 显示模块:LCD1602液晶 工作原理: 通过MPU6050采集XYZ三轴加速度数据,利用重力加速度分量计算俯仰…

2025年4月16日华为留学生笔试第二题200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 图书馆借阅管理系统 问题描述 卢小姐是一家大学图书馆的管理员,她需要开发一个简单的图书借阅管理系统来处理日常的图书流通操作。系统需要支持以下四种操作: in s:表示一本…

Linux通用一键换源脚本.sh - ubuntu、centos全自动更换国内源 - LinuxMirrors神器

效果 脚本 bash <(curl -sSL https://linuxmirrors.cn/main.sh) 来自 https://linuxmirrors.cn/ 截图 ending...

【Unity】JSON数据的存取

这段代码的结构是为了实现 数据的封装和管理&#xff0c;特别是在 Unity 中保存和加载玩家数据时。以下是对代码设计的逐步解释&#xff1a; 1. PlayerCoin 类 PlayerCoin 是一个简单的数据类&#xff0c;用于表示单个玩家的硬币信息。它包含以下字段&#xff1a; count&…

python实现音视频下载器

一、环境准备 确保当前系统已安装了wxPython 、 yt-dlp 和FFmpeg。当前主要支持下载youtube音视频 1、安装wxPython pip install wxPython2、安装yt-dp pip install wxPython yt-dlp3、安装FFmpeg 在Windows 10上通过命令行安装FFmpeg&#xff0c;最简便的方式是使用包管理…

使用 vxe-table 来格式化任意的金额格式,支持导出与复制单元格格式到 excel

使用 vxe-table 来格式化任意的金额格式&#xff0c;支持导出与复制单元格格式到 excel 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;https://gitee.com/x-extends/vxe-table 安装 npm install vx…

知识图谱 数据准备

任何类型的数据格式都可以用于构建知识图谱&#xff0c;只要能够从中提取出实体&#xff08;Entities&#xff09;、关系&#xff08;Relationships&#xff09;和属性&#xff08;Attributes&#xff09;。但实际操作中&#xff0c;不同数据格式的处理难度、工具支持和效率差异…

Docker 设置镜像源后仍无法拉取镜像问题排查

#记录工作 Windows系统 在使用 Docker 的过程中&#xff0c;许多用户会碰到设置了国内镜像源后&#xff0c;依旧无法拉取镜像的情况。接下来&#xff0c;记录了操作要点以及问题排查方法&#xff0c;帮助我们顺利解决这类问题。 Microsoft Windows [Version 10.0.27823.1000…

如何对Flutter应用程序进行单元测试

Flutter单元测试完全指南&#xff1a;从基础到高级实践 面试求职资源 面试试题小程序&#xff1a;涵盖测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、计算机网络知识、Jmeter、HR面试等内…

go中我遇到的问题总结

go问题总结 1 - go中的nil等于java中的null吗 在 Go 和 Java 中,nil 和 null 都用于表示“空值”,但它们的实现和使用方式有所不同。 以下是 Go 中的 nil 和 Java 中的 null 之间的对比: 1. Go 中的 nil 在 Go 中,nil 是一个预定义的常量,表示零值。它的行为根据数据类…

【android telecom 框架分析 01】【基本介绍 2】【BluetoothPhoneService为何没有源码实现】

1. 背景 我们会在很多资料上看到 BluetoothPhoneService 类&#xff0c;但是我们在实际 aosp 中确找不到具体的实现&#xff0c; 这是为何&#xff1f; 这是一个很好的问题&#xff01;虽然在车载蓝牙电话场景中我们经常提到类似 BluetoothPhoneService 的概念&#xff0c;但…