List<T> 核心特性
- 動態陣列實作,自動擴容
- 實作
IList<T>、ICollection<T>、IEnumerable<T>
- 提供
Item 索引器(list[i] 語法)
- 型別安全,免裝箱/拆箱
基本操作範例
var empList = new List();
var intList = new List();
// 新增元素
for (int i = 0; i < 5; i++)
{
empList.Add(new Employee(i + 100));
intList.Add(i * 5);
}
// 索引器存取
for (int i = 0; i < intList.Count; i++)
Console.Write($"{intList[i]} "); // 0 5 10 15 20
// 容量屬性
Console.WriteLine($"\nCapacity: {empList.Capacity}"); // 預設 4 (.NET Core) 或 16 (.NET Framework)
容量管理機制
擴容策略
- 預設初始容量:4(.NET Core / .NET 5+)或 16(.NET Framework)
- 擴容因子:2 倍(新容量 = 當前容量 × 2)
- 手動控制:
Capacity 屬性可讀寫,設定較小值會截斷資料
效能影響
// 預知大致筆數時預先配置,避免多次擴容複製
var list = new List(10000); // 直接配置 10000 容量
list.AddRange(largeData); // 單次複製完成
常用方法分類
| 分類 | 方法 | 複雜度 |
| 新增 | Add | O(1) 攤銷 |
| AddRange | O(n) |
| Insert | O(n) |
| 刪除 | Remove | O(n) |
| RemoveAt | O(n) |
| RemoveAll | O(n) |
| 查詢 | Contains | O(n) |
| IndexOf/LastIndexOf | O(n) |
| Find/FindAll/FindIndex | O(n) |
| 排序 | Sort | O(n log n) |
| Reverse | O(n) |
| 轉換 | ToArray | O(n) |
進階用法
Predicate 委派查找
var adults = empList.FindAll(e => e.Age >= 18);
var firstSenior = empList.Find(e => e.Age >= 60);
var index = empList.FindIndex(e => e.Name.StartsWith("A"));
自訂排序
empList.Sort((a, b) => a.Name.CompareTo(b.Name)); // 委派
empList.Sort(new EmployeeNameComparer()); // IComparer
轉換與投影
var names = empList.ConvertAll(e => e.Name); // List
var array = empList.ToArray(); // Employee[]
var readonlyList = empList.AsReadOnly(); // ReadOnlyCollection
效能比較:List<T> vs Array vs ArrayList
| 操作 | List<T> | Array | ArrayList |
| 隨機存取 | O(1) | O(1) | O(1) + 拆箱 |
| 尾部新增 | O(1) 攤銷 | 不可變 | O(1) 攤銷 + 裝箱 |
| 中間插入 | O(n) | 不可變 | O(n) + 裝箱 |
| 記憶體效率 | 高 | 最高 | 低(物件參考陣列) |
| 型別安全 | 編譯期 | 編譯期 | 執行期 |
最佳實踐
- 預知大小用建構式指定初始容量
- 頻繁增刪中間元素考慮
LinkedList<T>
- 唯讀傳遞用
AsReadOnly() 或 IReadOnlyList<T>
- 避免在迴圈中重複存取
Count 屬性(雖然 JIT 會優化)