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

Effective C# 原則 40:按需選擇集合,效能與功能雙贏

     編輯:關於C#

「哪種集合最好?」答案是「視情況而定」。.NET 提供陣列、ArrayList、Queue、Stack、Hashtable、SortedList、BitArray 等近 20 種集合,各有優化重點。選擇前必須分析操作模式,並透過介面(ICollection、IList、IDictionary)解耦具體實作(參見原則 19)。

三大集合族群

1. 陣列:最簡單、最快、型別安全

  • C# 陣列編譯期生成強型別 System.Array 衍生類,值類型零裝箱;
  • 一維陣列:int[] numbers = new int[100];
  • 多維陣列:int[,] board = new int[8, 8]; 記憶體連續、索引計算高效、foreach 單層迭代;
  • 鋸齒陣列:int[][] jagged = new int[5][]; 內層長度可異,但列存取需雙重索引、效能較差;
  • 缺點:大小固定,調整需重新配置複製,導致舊參考失效(需用 ArrayList 封裝解決)。

2. 類陣列集合:ArrayList、Queue、Stack

  • ArrayList:動態陣列封裝,語意混合陣列與鏈表,支援調整大小、索引存取、迭代;內部封裝陣列,無舊參考問題;
  • Queue/Stack:FIFO/LIFO 介面,內部同樣基於陣列,擴容有效能成本;
  • 建議:建構時指定 Capacity 減少擴容開銷。

3. 雜湊/字典集合:Hashtable、SortedList、ListDictionary、HybridDictionary

  • Hashtable:O(1) 查找,無序;
  • SortedList:鍵排序,O(log n) 查找,支援有序迭代;
  • ListDictionary:小資料量單向鏈表實作;
  • HybridDictionary:小量用 ListDictionary,大量自動轉 Hashtable;
  • 皆位於 System.Collections.Specialized。

特殊用途:BitArray

位元級儲存,支援 AND/OR/XOR/NOT 批次操作,適合大量旗標、遮罩運算,不適合一般布林陣列替代。

強型別封裝(C# 1.x 妥協方案)

繼承 CollectionBase/DictionaryBase,以 new 隱藏基底 object 成員,提供強型別 Add/索引子。C# 2.0 泛型徹底解決此問題。

對外公開集合:索引子與 IEnumerable

  • 支援多維索引子:public int this[int x, int y] { get { ... } }
  • 實作 IEnumerable 提供標準迭代;若為列表模型考慮 IList/ICollection,字典模型考慮 IDictionary;最簡做法:繼承 CollectionBase/DictionaryBase。

選擇清單

場景推薦集合
固定大小、高效能、多維索引多維陣列
動態增刪、索引存取ArrayList
FIFO/LIFOQueue/Stack
鍵值查找、無序Hashtable
鍵值查找、需有序SortedList
小量鍵值、記憶體敏感ListDictionary
位元旗標、批次邏輯運算BitArray
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved