C#實(shí)現(xiàn)List<T>去重的多種高效方法
引言
在 C# 開發(fā)中,處理集合數(shù)據(jù)是日常開發(fā)任務(wù)的重要組成部分。有時(shí)我們需要對 List<T> 進(jìn)行去重操作,以確保集合中的元素唯一。本文將介紹幾種實(shí)現(xiàn) List<T> 去重的方法,并探討它們的優(yōu)缺點(diǎn)和適用場景。C# 提供了多種方式來完成這項(xiàng)任務(wù),每種方法都有其獨(dú)特的優(yōu)勢。接下來,讓我們深入探討這些方法吧!
方法一:使用 HashSet
HashSet<T> 是一個(gè)不允許重復(fù)元素的集合類型,它基于哈希表實(shí)現(xiàn),因此提供了非??斓牟檎宜俣取?/p>
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> listA = new List<int> { 1, 2, 3, 4, 2, 3, 5 };
// 使用 HashSet 去重
HashSet<int> hashSet = new HashSet<int>(listA);
List<int> uniqueList = new List<int>(hashSet);
Console.WriteLine(string.Join(", ", uniqueList)); // 輸出:1, 2, 3, 4, 5
}
}
優(yōu)點(diǎn):
- 高效:時(shí)間復(fù)雜度為 O(n)。
- 簡潔:代碼量少,易于理解。
方法二:LINQ 的 Distinct 方法
如果你已經(jīng)習(xí)慣了 LINQ 的強(qiáng)大功能,那么 Distinct() 方法無疑是你的首選。它可以直接應(yīng)用于任何實(shí)現(xiàn)了 IEnumerable<T> 接口的集合。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<int> listA = new List<int> { 1, 2, 3, 4, 2, 3, 5 };
// 使用 LINQ 的 Distinct 方法去重
List<int> uniqueList = listA.Distinct().ToList();
Console.WriteLine(string.Join(", ", uniqueList)); // 輸出:1, 2, 3, 4, 5
}
}
優(yōu)點(diǎn):
- 鏈?zhǔn)秸{(diào)用友好:可以與其他 LINQ 操作無縫集成。
- 簡單直觀:一行代碼即可完成去重。
方法三:手動去重(循環(huán) + 判斷)
對于那些希望完全控制去重邏輯的開發(fā)者來說,手動遍歷并判斷是否已存在當(dāng)前元素是一種傳統(tǒng)但有效的手段。
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> listA = new List<int> { 1, 2, 3, 4, 2, 3, 5 };
List<int> uniqueList = new List<int>();
foreach (int item in listA)
{
if (!uniqueList.Contains(item))
{
uniqueList.Add(item);
}
}
Console.WriteLine(string.Join(", ", uniqueList)); // 輸出:1, 2, 3, 4, 5
}
}
優(yōu)點(diǎn):
- 靈活:可以根據(jù)需求調(diào)整去重邏輯。
- 不依賴外部工具:完全手寫邏輯,適合學(xué)習(xí)基礎(chǔ)。
缺點(diǎn):
- 性能較差:尤其是當(dāng)列表較大時(shí),
Contains的時(shí)間復(fù)雜度為 O(n),整體效率較低。
方法四:使用 Dictionary 或 Lookup
Dictionary<K,V> 和 Lookup<K,V> 也可以用來去重,因?yàn)樗鼈兊逆I是唯一的。
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> listA = new List<int> { 1, 2, 3, 4, 2, 3, 5 };
// 使用 Dictionary 去重
Dictionary<int, bool> dict = new Dictionary<int, bool>();
foreach (int item in listA)
{
if (!dict.ContainsKey(item))
{
dict[item] = true;
}
}
List<int> uniqueList = new List<int>(dict.Keys);
Console.WriteLine(string.Join(", ", uniqueList)); // 輸出:1, 2, 3, 4, 5
}
}
優(yōu)點(diǎn):
- 性能較好:查找速度快,適用于大數(shù)據(jù)集。
- 鍵值結(jié)構(gòu)靈活:適合擴(kuò)展。
方法五:排序后去重
如果允許改變原始列表順序,可以通過排序后移除相鄰重復(fù)項(xiàng)來去重。
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> listA = new List<int> { 1, 2, 3, 4, 2, 3, 5 };
// 排序后去重
listA.Sort();
List<int> uniqueList = new List<int> { listA[0] };
for (int i = 1; i < listA.Count; i++)
{
if (listA[i] != listA[i - 1])
{
uniqueList.Add(listA[i]);
}
}
Console.WriteLine(string.Join(", ", uniqueList)); // 輸出:1, 2, 3, 4, 5
}
}
優(yōu)點(diǎn):
- 適合排序場景:先排序再去除重復(fù)項(xiàng)。
- 邏輯簡單:直接比較相鄰元素。
缺點(diǎn):
- 會改變原始順序:不適合對順序敏感的情況。
結(jié)語
選擇哪種去重方法取決于具體的應(yīng)用場景和個(gè)人偏好。無論你是追求極致性能還是代碼簡潔性,總有一種方法能滿足你的需求。希望這篇文章能幫助你更好地理解和應(yīng)用 C# 中的 List<T> 去重技術(shù)!
通過這篇博客文章,不僅可以讓讀者了解到不同的去重方法,還能幫助他們在實(shí)際工作中根據(jù)具體情況選擇最合適的解決方案。
以上就是C#實(shí)現(xiàn)List<T>去重的多種高效方法的詳細(xì)內(nèi)容,更多關(guān)于C# List<T>去重的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實(shí)現(xiàn)多線程寫入同一個(gè)文件的方法
這篇文章主要介紹了C#實(shí)現(xiàn)多線程寫入同一個(gè)文件的方法,涉及C#多線程操作文件讀寫的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
c# 重載WndProc,實(shí)現(xiàn)重寫“最小化”的實(shí)現(xiàn)方法
在做“亦歌桌面版”的時(shí)候,發(fā)現(xiàn)當(dāng)打開歌詞狀態(tài)下,用最小化隱藏窗體到托盤的話(如下code #1),在調(diào)出發(fā)現(xiàn)歌詞縮小了(雖然顯現(xiàn)的窗體大小跟剛才一樣),從這點(diǎn)看調(diào)用該方法其實(shí)窗體大小是改變了的(這個(gè)過程只是不可視而已)。2009-02-02
C#中的LINQ簡化數(shù)據(jù)查詢與操作用法詳解
LINQ(Language Integrated Query)是C#中用于處理和操作數(shù)據(jù)的強(qiáng)大工具,它允許開發(fā)者以聲明式的方式編寫查詢,適用于多種數(shù)據(jù)源,本文介紹C#中的LINQ簡化數(shù)據(jù)查詢與操作用法,感興趣的朋友一起看看吧2025-11-11
C#實(shí)現(xiàn)Access通用訪問類OleDbHelper完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)Access通用訪問類OleDbHelper,結(jié)合完整實(shí)例形式分析了C#針對access數(shù)據(jù)庫的連接、查詢、遍歷、分頁顯示等相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
C#實(shí)現(xiàn)子類與父類的相互轉(zhuǎn)換
這篇文章主要介紹了C#實(shí)現(xiàn)子類與父類的相互轉(zhuǎn)換,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn)
這篇文章介紹了WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#實(shí)現(xiàn)的中國移動官網(wǎng)手機(jī)號碼采集器
這篇文章主要介紹了C#實(shí)現(xiàn)的中國移動官網(wǎng)手機(jī)號碼采集器,本文先是采集號碼入庫,同時(shí)給出了篩選各類靚號的SQL語句,需要的朋友可以參考下2014-10-10

