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

C# 泛型實戰:LinkedList 雙向鏈表與可空類型完整指南

     編輯:關於C#

一、LinkedList<T>:高效插入刪除的雙向鏈表

基本操作

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> 通常更快?

  • 記憶體局部性:List<T> 底層為連續陣列,CPU 快取命中率高;LinkedList 節點分散堆疊,GC 掃描成本大。
  • 插入刪除:雖然鏈表理論 O(1),但實測 List.Add 多數情況更快(尾端擴容攤銷成本低);List.Insert 需搬移元素,僅在頭部大量插入時鏈表有優勢。
  • 隨機存取:List 支援索引器 O(1);鏈表需遍歷 O(n)。
  • 搜尋:List.BinarySearch O(log n) 需預先排序;鏈表僅線性搜尋 O(n)。

結論:除非有明確「頻繁中間插刪、極少隨機存取」需求,否則優先選 List<T>。

二、可空類型(Nullable<T>)完整解析

宣告與初始化

int? a = null;                    // 語法糖
Nullable<int> b = new Nullable<int>(); // 完整寫法

兩者等價,HasValue 判斷是否有值,Value 取值(無值時拋異常)。

判斷有值的兩種寫法

if (a.HasValue) { ... }
if (a != null) { ... }  // 編譯器自動轉為 HasValue

運算與轉型陷阱

  • 可空類型參與運算:任一運算元為 null → 結果為 null(如 int? + int = int?)。
  • 比較運算:null < 100 為 false,null >= 100 亦為 false,務必先檢查 HasValue。
  • 轉非可空:(int)a 若 a 為 null 拋 InvalidOperationException;建議用 a.GetValueOrDefault() 或 a ?? defaultVal。

總結

掌握 LinkedList 適用場景與 Nullable<T> 邊界行為,能寫出更健壯、高效的 C# 程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved