「哪種集合最好?」答案是「視情況而定」。.NET 提供陣列、ArrayList、Queue、Stack、Hashtable、SortedList、BitArray 等近 20 種集合,各有優化重點。選擇前必須分析操作模式,並透過介面(ICollection、IList、IDictionary)解耦具體實作(參見原則 19)。
System.Array 衍生類,值類型零裝箱;int[] numbers = new int[100];int[,] board = new int[8, 8]; 記憶體連續、索引計算高效、foreach 單層迭代;int[][] jagged = new int[5][]; 內層長度可異,但列存取需雙重索引、效能較差;ArrayList 封裝解決)。ArrayList:動態陣列封裝,語意混合陣列與鏈表,支援調整大小、索引存取、迭代;內部封裝陣列,無舊參考問題;Queue/Stack:FIFO/LIFO 介面,內部同樣基於陣列,擴容有效能成本;Capacity 減少擴容開銷。Hashtable:O(1) 查找,無序;SortedList:鍵排序,O(log n) 查找,支援有序迭代;ListDictionary:小資料量單向鏈表實作;HybridDictionary:小量用 ListDictionary,大量自動轉 Hashtable;System.Collections.Specialized。位元級儲存,支援 AND/OR/XOR/NOT 批次操作,適合大量旗標、遮罩運算,不適合一般布林陣列替代。
繼承 CollectionBase/DictionaryBase,以 new 隱藏基底 object 成員,提供強型別 Add/索引子。C# 2.0 泛型徹底解決此問題。
public int this[int x, int y] { get { ... } }IEnumerable 提供標準迭代;若為列表模型考慮 IList/ICollection,字典模型考慮 IDictionary;最簡做法:繼承 CollectionBase/DictionaryBase。| 場景 | 推薦集合 |
|---|---|
| 固定大小、高效能、多維索引 | 多維陣列 |
| 動態增刪、索引存取 | ArrayList |
| FIFO/LIFO | Queue/Stack |
| 鍵值查找、無序 | Hashtable |
| 鍵值查找、需有序 | SortedList |
| 小量鍵值、記憶體敏感 | ListDictionary |
| 位元旗標、批次邏輯運算 | BitArray |