為什麼需要集合?陣列的四大短板
- 固定長度:
Array.Resize 實為建立新陣列複製,效能差
- 型別單一:宣告時鎖定元素型別,集合預設儲存
object
- 無唯讀保護:陣列無法輕易暴露唯讀視圖
- 僅支援整數索引:無法用鍵值、優先序、LIFO/FIFO 等語意存取
六大非泛型集合詳細比較
| 集合 | 命名空間 | 資料結構 | 核心特性 | 典型用途 |
| ArrayList | System.Collections | 動態陣列 | 索引存取、自動擴容、AddRange/InsertRange | 一般用途動態清單 |
| Stack | System.Collections | LIFO 堆疊 | Push/Pop/Peek、無索引 | 回溯演算法、括號匹配、Undo 機制 |
| Queue | System.Collections | FIFO 隊列 | Enqueue/Dequeue/Peek、無索引 | 訊息佇列、BFS、工作排程 |
| Hashtable | System.Collections | 雜湊表 | Key-Value、O(1) 查找、鍵唯一、無序 | 快速查找、快取、字典映射 |
| SortedList | System.Collections | 排序雙陣列 | Key 自動排序、索引/鍵雙重存取、插入較慢 O(n) | 需有序列舉的鍵值對、小資料量排序字典 |
| NameValueCollection | System.Collections.Specialized | 雜湊表(鍵可重複) | 單一鍵對應多值、GetValues(key) 取得陣列 | HTTP Header、查詢字串、表單資料 |
程式碼範例精華
ArrayList 靈活操作
var list = new ArrayList { 100, 9, 3, 7 };
list.AddRange(new[] { 11, 12 });
list.Remove(3); // 移除值
list.RemoveAt(3); // 移除索引
var sub = new ArrayList(list.GetRange(1, 3)); // 切片
foreach (int n in list) Console.WriteLine(n); // 無需轉型(編譯器隱含)
for (int i = 0; i < sub.Count; i++) Console.WriteLine((int)sub[i]); // 需轉型
Stack / Queue 核心操作
var stack = new Stack();
stack.Push(1); stack.Push(2);
stack.Pop(); // 2,移除
stack.Peek(); // 1,不移除
var queue = new Queue();
queue.Enqueue(1); queue.Enqueue(2);
queue.Dequeue(); // 1,移除
queue.Peek(); // 2,不移除
Hashtable vs NameValueCollection 差異
var ht = new Hashtable();
ht["key"] = "value1";
ht["key"] = "value2"; // 覆蓋,鍵唯一
var nvc = new NameValueCollection();
nvc.Add("key", "value1");
nvc.Add("key", "value2"); // 允許重複鍵
nvc.GetValues("key"); // 回傳 ["value1", "value2"]
現代化建議:改用泛型集合
| 舊集合 | 建議替代 | 優勢 |
| ArrayList | List<T> | 型別安全、避免裝箱/拆箱、效能更好 |
| Stack | Stack<T> | 同左 |
| Queue | Queue<T> | 同左 |
| Hashtable | Dictionary<TKey, TValue> | 型別安全、介面豐富 |
| SortedList | SortedDictionary<TKey, TValue> / SortedList<TKey, TValue> | 泛型版本效能更佳 |
| NameValueCollection | Dictionary<string, List<string>> / ILookup<string, string> | LINQ 友善、型別安全 |
特殊集合補充
- HybridDictionary:
<10 項用 ListDictionary(線性搜尋),超過自動轉 Hashtable,小資料量極致效能
- ListDictionary:極小資料量(<10)最佳
- StringCollection:強型別字串清單
- BitArray:位元陣列、旗標集合