C# 比較兩個List集合內容是否相同

?在 C# 中,要比較兩個 List<T> 集合的內容是否相同,可以通過以下幾種方法:

?一、非自定義類的元素比較

1. 使用 SequenceEqual 方法(順序和內容都相等

順序和內容都相等:使用 SequenceEqual

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> list1 = new List<int> { 1, 2, 3, 4 };List<int> list2 = new List<int> { 1, 2, 3, 4 };bool areEqual = list1.SequenceEqual(list2);Console.WriteLine($"Are the lists equal? {areEqual}");}
}

2. 自定義比較邏輯(如果順序不重要)

忽略順序:可以先對兩個列表排序后再使用 SequenceEqual

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> list1 = new List<int> { 1, 2, 3, 4 };List<int> list2 = new List<int> { 4, 3, 2, 1 };bool areEqual = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x));Console.WriteLine($"Are the lists equal (ignoring order)? {areEqual}");}
}

3. 使用 Set 比較(忽略重復元素)

忽略重復元素:可以使用 HashSet<T>

using System;
using System.Collections.Generic;class Program
{static void Main(){List<int> list1 = new List<int> { 1, 2, 3, 4 };List<int> list2 = new List<int> { 4, 3, 2, 1 };bool areEqual = new HashSet<int>(list1).SetEquals(list2);Console.WriteLine($"Are the lists equal (ignoring duplicates)? {areEqual}");}
}

?二、自定義類的元素比較

如果你想比較自定義對象的集合,比如 List<MyClass>,你需要自定義比較規則。默認情況下,List<T> 的比較是基于對象引用的比較(即兩個對象的引用是否相同),而不是根據對象的內容來判斷。

為了比較自定義元素,你需要重寫 EqualsGetHashCode 方法。這樣,比較時會依據你定義的規則進行比較。

假設你有一個自定義類 Person,你想根據 NameAge 屬性來判斷兩個 Person 對象是否相同。

重寫 EqualsGetHashCode

你需要重寫 Equals 方法來比較兩個對象是否相等,并且重寫 GetHashCode,以確保集合操作(如 HashSetExcept)正常工作。

1、Equals 方法比較兩個 Person 對象的 NameAge 屬性。

 public override bool Equals(object obj){if (obj is Person other){return this.Name == other.Name && this.Age == other.Age;}return false;}

2、GetHashCode 使用 HashCode.Combine 來生成一個基于 NameAge 的哈希值,確保兩個內容相同的 Person 對象具有相同的哈希值。

 public override int GetHashCode(){return HashCode.Combine(Name, Age);}

1. 順序和內容都相等

順序和內容都相等:使用 SequenceEqual

using System;
using System.Collections.Generic;
using System.Linq;class Person
{public string Name { get; set; }public int Age { get; set; }public override bool Equals(object obj){if (obj is Person other){return this.Name == other.Name && this.Age == other.Age;}return false;}public override int GetHashCode(){return HashCode.Combine(Name, Age);}
}class Program
{static void Main(){List<Person> list1 = new List<Person>{new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 }};List<Person> list2 = new List<Person>{new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 }};bool isSame = list1.SequenceEqual(list2);Console.WriteLine($"順序和內容都相等: {isSame}");}
}

2. 忽略順序

忽略順序:先對兩個列表排序,然后使用 SequenceEqual

using System;
using System.Collections.Generic;
using System.Linq;class Person
{public string Name { get; set; }public int Age { get; set; }public override bool Equals(object obj){if (obj is Person other){return this.Name == other.Name && this.Age == other.Age;}return false;}public override int GetHashCode(){return HashCode.Combine(Name, Age);}
}class Program
{static void Main(){List<Person> list1 = new List<Person>{new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 }};List<Person> list2 = new List<Person>{new Person { Name = "Bob", Age = 30 },new Person { Name = "Alice", Age = 25 }};bool isSame = list1.OrderBy(p => p.Name).ThenBy(p => p.Age).SequenceEqual(list2.OrderBy(p => p.Name).ThenBy(p => p.Age));Console.WriteLine($"忽略順序: {isSame}");}
}

3. 忽略重復元素

忽略重復元素:將列表轉換為 HashSet<T>,然后使用 SetEquals 方法進行比較。?

如果你希望忽略重復元素并只關心唯一元素是否相同,可以使用 HashSet<T> 來進行比較。HashSet<T> 會自動去除重復元素,因此可以通過將列表轉換為 HashSet<T> 來忽略重復元素。

using System;
using System.Collections.Generic;class Person
{public string Name { get; set; }public int Age { get; set; }public override bool Equals(object obj){if (obj is Person other){return this.Name == other.Name && this.Age == other.Age;}return false;}public override int GetHashCode(){return HashCode.Combine(Name, Age);}
}class Program
{static void Main(){List<Person> list1 = new List<Person>{new Person { Name = "Alice", Age = 25 },new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 }};List<Person> list2 = new List<Person>{new Person { Name = "Bob", Age = 30 },new Person { Name = "Alice", Age = 25 }};bool isSame = new HashSet<Person>(list1).SetEquals(new HashSet<Person>(list2));Console.WriteLine($"忽略重復元素: {isSame}");}
}

總結

  • 順序和內容都相等:使用 SequenceEqual
  • 忽略順序:可以先對兩個列表排序后再使用 SequenceEqual
  • 忽略重復元素:可以使用 HashSet<T>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895042.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Win10環境使用ChatBox集成Deep Seek解鎖更多玩法

Win10環境使用ChatBox集成Deep Seek解鎖更多玩法 前言 之前部署了14b的Deep Seek小模型&#xff0c;已經驗證了命令行及接口方式的可行性。但是純命令行或者PostMan方式調用接口顯然不是那么友好&#xff1a; https://lizhiyong.blog.csdn.net/article/details/145505686 純…

力扣 239.滑動窗口最大值

思路 滑動窗口 遍歷 解題思路 基本思路&#xff1a;使用滑動窗口法遍歷數組&#xff0c;動態維護當前窗口的最大值。 特殊情況&#xff1a;該方法有一個缺陷&#xff0c;如果出窗口的元素是當前窗口的最大值max時&#xff0c;接下來的窗口中的最大值就無法確定了&#xff0c;所…

【Pandas】pandas Series sum

Pandas2.2 Series Computations descriptive stats 方法描述Series.abs()用于計算 Series 中每個元素的絕對值Series.all()用于檢查 Series 中的所有元素是否都為 True 或非零值&#xff08;對于數值型數據&#xff09;Series.any()用于檢查 Series 中是否至少有一個元素為 T…

kafka服務端之日志磁盤存儲

文章目錄 頁緩存順序寫零拷貝 Kafka依賴于文件系統&#xff08;更底層地來說就是磁盤&#xff09;來存儲和緩存消息 。 那么kafka是如何讓自身在使用磁盤存儲的情況下達到高性能的&#xff1f;接下來主要從3各方面詳細解說。 頁緩存 頁緩存是操作系統實現的一種主要的磁盤緩存…

ES6 Map 數據結構是用總結

1. Map 基本概念 Map 是 ES6 提供的新的數據結構&#xff0c;它類似于對象&#xff0c;但是"鍵"的范圍不限于字符串&#xff0c;各種類型的值&#xff08;包括對象&#xff09;都可以當作鍵。Map 也可以跟蹤鍵值對的原始插入順序。 1.1 基本用法 // 創建一個空Map…

計算機視覺語義分割——Attention U-Net(Learning Where to Look for the Pancreas)

計算機視覺語義分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目錄 計算機視覺語義分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模塊3. 軟注意力與硬注意力4. 實驗…

韶音科技:消費電子行業售后服務實現數字化轉型,重塑客戶服務體系

韶音科技&#xff1a;消費電子行業售后服務實現數字化轉型&#xff0c;重塑客戶服務體系 在當今這個科技日新月異的時代&#xff0c;企業之間的競爭早已超越了單純的產品質量比拼&#xff0c;**售后服務成為了衡量消費電子行業各品牌實力與客戶滿意度的關鍵一環。**深圳市韶音…

機器學習之Transformer 模型

Transformer 模型詳解 Transformer 是由 Vaswani et al. 在 2017 年 提出的模型,最初用于 機器翻譯 任務,并迅速成為自然語言處理(NLP)領域的標準模型架構。與傳統的 RNN(循環神經網絡) 和 LSTM(長短期記憶網絡) 不同,Transformer 的核心思想是 完全基于自注意力機制…

使用 CloudDM 和釘釘流程化管理數據庫變更審批

CloudDM 是一個專為團隊協同工作打造的數據庫數據管控平臺。在管控數據庫安全變更的過程中&#xff0c;為提高效率&#xff0c;CloudDM 接入了釘釘&#xff0c;支持實時通知與移動辦公&#xff0c;滿足廣大企業用戶的實際需求。 本文將介紹如何使用 CloudDM 和釘釘實現高效的數…

【RabbitMQ的重試配置retry】重試配置不生效原因

在Spring Boot項目中&#xff0c;RabbitMQ的retry重試配置不生效可能由以下原因導致&#xff1a; 核心問題定位 retry:enabled: true # ? 配置已開啟max-attempts: 3 # ? 參數有效但實際未觸發重試&#xff0c;可能原因如下&#xff1a; 1. 容器類型不匹配 癥狀表現 配置…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是將DeepSeek功能集成到WPS中的詳細步驟&#xff0c;無需本地部署模型&#xff0c;直接通過官網連接使用&#xff1a;1. 下載并安裝OfficeAI插件 &#xff08;1&#xff09;訪問OfficeAI插件下載地址&#xff1a;OfficeAI助手 - 免費辦公智能AI助手, AI寫作&#xff0c;下載…

程序詩篇里的靈動筆觸:指針繪就數據的夢幻藍圖<7>

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。 今天我們一起來學習轉移表&#xff0c;回調函數&#xff0c;qsort… 目錄 一、轉移表1.1 定義與原理1.3…

使用Jenkins實現鴻蒙HAR應用的自動化構建打包

使用Jenkins實現鴻蒙HAR應用的自動化構建打包 在軟件開發領域&#xff0c;自動化構建是提高開發效率和確保代碼質量的重要手段。特別是在鴻蒙&#xff08;OpenHarmony&#xff09;應用開發中&#xff0c;自動化構建更是不可或缺。本文將詳細介紹如何使用Jenkins命令行工具實現…

漏洞分析 Spring Framework路徑遍歷漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美國威睿&#xff08;VMware&#xff09;公司的一套開源的Java、JavaEE應用程序框架。該框架可幫助開發人員構建高質量的應用。 近期&#xff0c;監測到Spring Framework在特定條件下&#xff0c;存在目錄遍歷漏洞&#xff08;網宿評分&am…

筆記:理解借貸相等的公式

強烈推薦非會計人士&#xff0c;快速了解會計看這個系列的視頻&#xff0c;其中比較燒腦的“借貸相等”公式&#xff0c;這個視頻講解的不錯&#xff1a; 4.小白財務入門-借貸記賬法_嗶哩嗶哩_bilibili 比如這里&#xff0c;錢在銀行卡重&#xff0c;所以銀行存款就是借方…

Java算法技術文章:深入解析排序、搜索與數據結構

引言 在軟件開發的世界里&#xff0c;算法不僅是程序設計的基礎&#xff0c;更是提升軟件性能、優化用戶體驗的關鍵。Java&#xff0c;作為一種廣泛使用的編程語言&#xff0c;提供了豐富的API和標準庫來支持各種算法的實現。本文將深入探討Java中的排序算法、搜索算法以及一些…

Android15音頻進階之MediaRecorder支持通道(一百零五)

簡介: CSDN博客專家、《Android系統多媒體進階實戰》一書作者 新書發布:《Android系統多媒體進階實戰》?? 優質專欄: Audio工程師進階系列【原創干貨持續更新中……】?? 優質專欄: 多媒體系統工程師系列【原創干貨持續更新中……】?? 優質視頻課程:AAOS車載系統+…

個人 Vite 構建性能分析插件開發實踐

Vite 構建分析插件開發實踐 一、開發背景 在個人項目開發中遇到以下問題&#xff1a; &#x1f552; 構建時間波動大&#xff08;30%&#xff09;&#x1f50d; 難以定位耗時模塊&#x1f4c8; 缺乏構建進度反饋 開發目標&#xff1a; 實現模塊級耗時分析提供實時進度預測識…

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一個開源的輕量級框架&#xff0c;是為了簡化企業級開發而設計的。我們通常講的Spring一般指的是Spring Framework。Spring的核心是控制反轉(IoC-Inversion of Control)和面向切面編程(AOP-Aspect-Oriented Programming)。這些功能使得開發者…

學習筆記:機器學習中的數學原理(一)

1. 集合 集合分為有限集和無限集&#xff1b; 對于有限集&#xff0c;兩集合元素數相等即為等勢&#xff1b; 對于無限集&#xff0c;兩集合元素存在一一映射關系即為等勢&#xff1b; 無限集根據是否與正整數集等勢分為可數集和不可數集。 2. sigmoid函數&#xff08;也叫…