首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 集合選型完全指南:從數據結構到實戰決策

     編輯:關於C語言

選對集合,事半功倍。.NET 基礎類庫 (FCL) 提供了豐富的泛型集合,但面對 List<T>、Dictionary<TKey,TValue>、Queue<T>、HashSet<T> 等眾多選擇,如何決策?本文從數據結構原理出發,建立系統性選型框架。

集合分類全景圖

集合按邏輯結構分為線性與非線性:

  • 線性:元素具唯一前驅/後驅(陣列、鏈表、棧、隊列、字典)
  • 非線性:元素具多前驅/後驅(樹、圖)—— FCL 實現較少

線性集合按存儲方式再分:

存儲方式典型類型優勢劣勢
直接存儲 (隨機訪問)Array, List<T>, string, struct索引訪問 O(1),尾部添加 O(1)中間插入/刪除 O(n),需移動元素
順序存儲 (鏈式)LinkedList<T>, Queue<T>, Stack<T>, Dictionary<TKey,TValue>插入/刪除 O(1),動態擴縮查找 O(n),無索引訪問

核心集合選型決策樹

1. 需要索引訪問、尾部高頻添加 → List<T>

最通用的動態陣列。若大小固定且無裝箱拆箱需求,優先用 T[] 陣列。

2. 先入先出 (FIFO) 流程 → Queue<T>

適用:任務調度、消息隊列、生產者-消費者模式。Enqueue/Dequeue 均 O(1)。

var cmdQueue = new Queue<Command>();
// 生產者
cmdQueue.Enqueue(new Command(...));
// 消費者線程
while (cmdQueue.TryDequeue(out var cmd)) cmd.Execute();

3. 後入先出 (LIFO) 回溯 → Stack<T>

適用:撤銷操作、語法解析、深度優先搜索。Push/Pop/Peek 均 O(1)。

4. 鍵值快速查找 → Dictionary<TKey,TValue>

基於哈希表,查找/插入/刪除平均 O(1)。鍵需正確實現 GetHashCode/Equals。

5. 高頻中間插入/刪除、無需索引 → LinkedList<T>

雙向鏈表,提供 AddBefore/AddAfter/AddFirst/AddLast。無 Add 方法,需持有節點引用操作。

6. 去重、集合運算 (交/並/差) → HashSet<T>

無序、不重複。提供 UnionWith/IntersectWith/ExceptWith/SymmetricExceptWith 等集合代數運算。

7. 需要有序序列 → Sorted 系列

  • SortedList<TKey,TValue>:鍵有序,內存緊湊,插入較慢
  • SortedDictionary<TKey,TValue>:紅黑樹,插入/刪除 O(log n)
  • SortedSet<T>:有序去重集合

8. 多線程環境 → Concurrent 系列

命名空間 System.Collections.Concurrent:

  • ConcurrentDictionary<TKey,TValue>
  • ConcurrentQueue<T> / ConcurrentStack<T>
  • ConcurrentBag<T> (無序、可重複)

內部用無鎖或細粒度鎖實現線程安全,避免手動 lock 開銷。

性能速查表 (參考量級)

操作List<T>LinkedList<T>Dictionary<TKey,TValue>HashSet<T>
索引訪問O(1) ✓O(n)N/AN/A
尾部添加O(1) ✓O(1) ✓O(1) ✓O(1) ✓
中間插入O(n)O(1)* ✓N/AN/A
查找O(n)O(n)O(1) ✓O(1) ✓
去重手動手動鍵天然去重天然 ✓

* 需持有目標節點引用

避坑指南

  • 勿用非泛型集合 (ArrayList, Hashtable):裝箱拆箱性能損耗大,無類型安全
  • 不要在 foreach 中修改集合:會拋 InvalidOperationException,改用 for 逆序或 RemoveAll
  • 大量添加時預分配容量:new List<T>(expectedCount) 減少擴容拷貝
  • 值類型做字典鍵:確保不可變性,避免哈希碼變更導致查找失效

結語

沒有萬能集合,只有最適合場景的集合。理解底層數據結構的時間/空間複雜度,結合業務訪問模式(讀多寫少?頻繁插入刪除?需去重?需有序?多線程?),才能做出最優選型。將本文決策樹收藏,下次選型不再猶豫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved