LinkedList<T> 為 .NET 內建的雙向鏈表,每個節點(LinkedListNode<T>)同時持有 Previous 與 Next 指標,支援 O(1) 首尾插入、指定節點前後插入。範例以 TodoItem 示範:
var list = new LinkedList<TodoItem>();
list.AddFirst(new TodoItem("buy door", "first"));
list.AddFirst(new TodoItem("paint door", "third"));
list.AddBefore(list.Find("paint door"), new TodoItem("assemble door", "second"));
list.AddAfter(list.Find("paint door"), new TodoItem("hang door", "last"));
輸出順序即為邏輯順序:buy → assemble → paint → hang。透過 First、Last、Previous、Next 可任意導航。
List<T> 底層為連續陣列,CPU 快取命中率高;LinkedList 節點分散堆疊,GC 掃描成本大。List.Add 多數情況更快(尾端擴容攤銷成本低);List.Insert 需搬移元素,僅在頭部大量插入時鏈表有優勢。List 支援索引器 O(1);鏈表需遍歷 O(n)。List.BinarySearch O(log n) 需預先排序;鏈表僅線性搜尋 O(n)。結論:除非有明確「頻繁中間插刪、極少隨機存取」需求,否則優先選 List<T>。
int? a = null; // 語法糖
Nullable<int> b = new Nullable<int>(); // 完整寫法
兩者等價,HasValue 判斷是否有值,Value 取值(無值時拋異常)。
if (a.HasValue) { ... }
if (a != null) { ... } // 編譯器自動轉為 HasValue
int? + int = int?)。null < 100 為 false,null >= 100 亦為 false,務必先檢查 HasValue。(int)a 若 a 為 null 拋 InvalidOperationException;建議用 a.GetValueOrDefault() 或 a ?? defaultVal。掌握 LinkedList 適用場景與 Nullable<T> 邊界行為,能寫出更健壯、高效的 C# 程式碼。