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.pswp.cn/pingmian/77209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77209.shtml
英文地址,請注明出處:http://en.pswp.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;但…