C#中比較兩個(gè)List是否相等的常見方法
簡(jiǎn)介
在 C# 里,比較兩個(gè) List 是否相等,需要考慮多個(gè)方面,例如列表中的元素順序、元素本身是否相等。下面介紹幾種常見的比較方法:
基本類型比較(元素順序必須一致)
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
復(fù)雜類型(自定義對(duì)象列表)
- 實(shí)現(xiàn)
Equals和GetHashCode方法
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
判斷是否完全包含對(duì)方(不關(guān)心順序)
bool setEqual = list1.Count == list2.Count &&
!list1.Except(list2).Any() &&
!list2.Except(list1).Any();
使用 SetEquals(無序、無重復(fù)判斷)
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
比較兩個(gè) null 列表
List<int>? list5 = null; List<int>? list6 = null; Console.WriteLine(list5 == list6); // 輸出: True
比較兩個(gè)包含null元素的列表
List<string?> list7 = new List<string?> { "a", null };
List<string?> list8 = new List<string?> { "a", null };
Console.WriteLine(list7.SequenceEqual(list8)); // 輸出: True
性能優(yōu)化建議
小規(guī)模數(shù)據(jù):使用
SequenceEqual或HashSet。大規(guī)模數(shù)據(jù):
- 先檢查列表長(zhǎng)度是否相同。
- 使用并行化處理(如
AsParallel().SequenceEqual())。
總結(jié)
| 場(chǎng)景 | 方法 | 是否考慮順序 | 是否考慮重復(fù)次數(shù) |
|---|---|---|---|
| 順序敏感且內(nèi)容相同 | SequenceEqual | 是 | 是 |
| 順序不敏感且內(nèi)容相同 | HashSet.SetEquals | 否 | 否 |
| 順序不敏感但重復(fù)次數(shù)相同 | 排序后使用 SequenceEqual | 否 | 是 |
| 自定義對(duì)象比較 | 重寫 Equals 或使用 IEqualityComparer | 可配置 | 可配置 |
到此這篇關(guān)于C#中比較兩個(gè)List是否相等的常見方法的文章就介紹到這了,更多相關(guān)C#比較兩個(gè)List相等內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 中使用NModbus4通信庫(kù)執(zhí)行寫操作
在C#中NModbus4庫(kù)提供了一個(gè)方便的方式來與支持Modbus協(xié)議的設(shè)備進(jìn)行交互,本文就來介紹了使用NModbus4通信庫(kù)執(zhí)行寫操作,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
WPF使用webView實(shí)現(xiàn)顯示瀏覽器網(wǎng)頁
在WPF中顯示一個(gè)可以操作的瀏覽器界面,你可以使用WebBrowser控件或WebView2控件,下面我們就來看看如何分別使用這兩個(gè)控件實(shí)現(xiàn)顯示瀏覽器網(wǎng)頁吧2025-01-01
C# WinForm狀態(tài)欄實(shí)時(shí)顯示當(dāng)前時(shí)間(窗體狀態(tài)欄StatusStrip示例)
這篇文章主要介紹了C# WinForm狀態(tài)欄實(shí)時(shí)顯示當(dāng)前時(shí)間(窗體狀態(tài)欄StatusStrip示例),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
區(qū)分WCF與WebService的異同、優(yōu)勢(shì)
這篇文章主要幫助大家區(qū)分WCF與WebService的異同、優(yōu)勢(shì),分為三大方面進(jìn)行研究學(xué)習(xí),感興趣的小伙伴們可以參考一下2016-03-03
C#實(shí)現(xiàn)中文錄音文件轉(zhuǎn)為文本文字
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)把中文錄音文件(.mp3 .wav)轉(zhuǎn)為文本文字內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考下2024-12-12
C#使用CancellationTokenSource 取消 Task的方法
因?yàn)樯婕暗搅巳粘=?jīng)常會(huì)碰到的取消任務(wù)操作,本文主要介紹了C#使用CancellationTokenSource 取消 Task,文中通過代碼介紹的非常詳細(xì),感興趣的可以了解一下2022-02-02

