当前位置: 首页 > news >正文

在C#中判断两个列表数据是否相同

1. 使用SequenceEqual方法(顺序敏感)

List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 1, 2, 3 };bool areEqual = list1.SequenceEqual(list2);
Console.WriteLine($"列表是否相同: {areEqual}"); // 输出: True

2. 不考虑顺序的比较(使用HashSet)

List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 3, 2, 1 };bool areEqual = new HashSet<int>(list1).SetEquals(list2);
Console.WriteLine($"列表是否相同(不考虑顺序): {areEqual}"); // 输出: True

3. 使用LINQ All和Contains方法

List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 1, 2, 3 };bool areEqual = list1.Count == list2.Count && list1.All(list2.Contains);
Console.WriteLine($"列表是否相同: {areEqual}"); // 输出: True

4. 自定义对象列表的比较(需要重写Equals和GetHashCode)

public class Person
{public int Id { get; set; }public string Name { get; set; }public override bool Equals(object obj){return obj is Person person && Id == person.Id && Name == person.Name;}public override int GetHashCode(){return HashCode.Combine(Id, Name);}
}// 使用
List<Person> people1 = new List<Person> { new Person { Id = 1, Name = "Alice" } };
List<Person> people2 = new List<Person> { new Person { Id = 1, Name = "Alice" } };bool areEqual = people1.SequenceEqual(people2);
Console.WriteLine($"对象列表是否相同: {areEqual}"); // 输出: True

5. 使用Enumerable.Except方法

List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 1, 2, 3 };bool areEqual = !list1.Except(list2).Any() && !list2.Except(list1).Any();
Console.WriteLine($"列表是否相同: {areEqual}"); // 输出: True

6. 性能考虑(大型列表)

对于大型列表,使用HashSet通常更高效:

List<int> bigList1 = Enumerable.Range(1, 100000).ToList();
List<int> bigList2 = Enumerable.Range(1, 100000).ToList();var stopwatch = Stopwatch.StartNew();
bool areEqual = new HashSet<int>(bigList1).SetEquals(bigList2);
stopwatch.Stop();Console.WriteLine($"大型列表比较结果: {areEqual}, 耗时: {stopwatch.ElapsedMilliseconds}ms");

7. 比较部分属性(使用LINQ)

如果只需要比较对象的某些属性:

List<Person> people1 = new List<Person> { new Person { Id = 1, Name = "Alice" } };
List<Person> people2 = new List<Person> { new Person { Id = 1, Name = "Alice" } };bool areEqual = people1.Select(p => new { p.Id, p.Name }).SequenceEqual(people2.Select(p => new { p.Id, p.Name }));

注意事项

1、顺序敏感:SequenceEqual会考虑元素的顺序

2、性能:对于大型列表,HashSet方法通常更高效

3、自定义对象:比较自定义对象时需要正确实现EqualsGetHashCode

4、重复元素:如果有重复元素,HashSet方法会认为[1,1,2][1,2,2]是相同的

5、空值处理:确保你的比较逻辑能正确处理null值

http://www.dtcms.com/a/299178.html

相关文章:

  • 前缀和-238-除自身以外数组的乘积-力扣(LeetCode)
  • 数学建模国赛历年赛题与优秀论文学习思路
  • 弹性元空间:JEP 387 深度解析与架构演进
  • Windows Server存储池,虚拟磁盘在系统启动后不自动连接需要手动连接
  • Matrix Theory study notes[5]
  • Mybatis学习之配置文件(三)
  • 数学专业数字经济转型全景指南
  • 广东省省考备考(第五十七天7.26)——数量、言语(强化训练)
  • Linux c++ CMake常用操作
  • 提升网站性能:如何在 Nginx 中实现 Gzip 压缩和解压!
  • 广告业务中A/B实验分桶方法比较:UID VS DID
  • DIY心率监测:用ESP32和Max30102打造个人健康助手
  • Voxtral Mini:语音转文本工具,支持超长音频,多国语音
  • VMware Workstation17下安装Ubuntu20.04
  • Qt 线程池设计与实现
  • 面试150 只出现一次的数字
  • Pinia快速入门
  • 大模型面试回答,介绍项目
  • Flutter实现Retrofit风格的网络请求封装
  • Qt 线程同步机制:互斥锁、信号量等
  • VTK交互——ImageRegion
  • Mixture-of-Recursions: 混合递归模型,通过学习动态递归深度,以实现对自适应Token级计算的有效适配
  • RK3568笔记九十二:QT使用Opencv显示摄像头
  • 基于RK3588+国产实时系统的隧道掘进机智能操控终端应用
  • NOIP普及组|2009T1多项式输出
  • 20250726让荣品的PRO-RK3566开发板通过TF卡刷Buildroot系统
  • 详解力扣高频SQL50题之1141. 查询近30天活跃用户数【简单】
  • 工具 | 解决 VSCode 中的 Delete CR 问题
  • 黑屏运维OceanBase数据库的常见案例
  • Java中配置两个r2db连接不同的数据库