程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#泛型秘訣(4)(2)

C#泛型秘訣(4)(2)

編輯:關於C語言

討論

LinkedList<T>類在.Net framework中是一個雙向鏈表。這是因為鏈表中的每一個節點都包含了前一節點和後一節點的指針。圖4-1演示了這種結構,圖中的每個node代表了一個單獨的LinkedListNode<T>對象。

注意圖中鏈表的每個節點(方塊)包含了一個指向下一節點的指針(指向右邊的箭頭)和一個指向前一節點的指針(指向左邊的箭頭)。相反,單鏈表只包含指向下一節點的指針,它沒有指向前一節點的指針。

在LinkedList類中,前一節點通過訪問Previous屬性獲得,後一節點通過訪問Next屬性獲得。鏈表中的第一個節點的Previous屬性總是返回null值。兩樣,最後一個節點的Next屬性也是返回null值。

鏈表中的每個節點(圖4-1中用方塊表示)實際上都是一個LinkedListNode<T>對象。所以LinkedList<T>對象實際上是由一組LinkedListNode<T>對象組成,所有這些LinkedListNode<T>對象都包含了訪問下一個和前一個LinkedListNode<T>對象的屬性。LinkedListNode<T>中所包含的對象可以通過Value屬性訪問。除了這些屬性外,LinkedListNode<T>對象還有一個屬性叫List,可以用它來訪問所屬的LinkedList<T>對象。

性能是我們非常關心的一個問題,List<T>類的性能優越於LinkedList<T>類。一般情況下在List<T>內添加和刪除節點要比在LinkedList<T>內進行同樣的操作快。對比List<T>.Add方法和LinkedList<T>類的Add*方法(譯者注:之所以是Add*方法是因為LinkedList<T>中的添加方法有:AddAfter、AddBefore、AddFirst、AddLast),導到性能上的差異並非因為添加操作本身,而是LinkedList<T>在垃圾回收時的壓力。List<T>的數據本質上是存放在托管堆中的一個大容量數組之上,然而LinkedList<T>有可能會把它的節點存放在托管堆的每個角落。這使得強制垃圾回收在處理托管堆中的LinkedList<T>節點對象時需要花費更多的力氣。需要注意,List<T>.Insert方法可能會比LinkedList<T>中的任一個Add*方法要慢,但這取決於對象在List<T>的哪個位置插入。當在某個點插入一人新元素時,Insert方法必須移動它後面的所有元素一個位置。如果新元素插入到List<T>的尾部,移動元素所花費的開銷比起垃圾回收所花費的開銷就可以忽略不計了。

List<T>另外一個勝於LinkedList<T>的地方是可以使用索引訪問。在List<T>中,您可以使用索引器並通過索引值來訪問指定位置的某個元素。但在LinkedList<T>中就沒有這麼令人愉快了。在LinkedList<T>類中,您必須使用每個LinkedListNode<T>中的Previous和Next屬性進行導航,並貫穿整個鏈表直到找到您所指定的位置。

在搜索一個元素或節點時,List<T>類也比LinkedList<T>類有速度上的優勢。使用List<T>.BinarySearch方法在List<T>內查找元素比在LinkedList<T>類中使用相應的Contains、Find、FindLast方法更快,這是因為LinkedList<T>的方法執行線性搜索而List<T>.BinarySearch方法執行二分查找法。一般條件下,二分查找法利用元素在List<T>內是按順序排列的。這使得在進行二分查找之前必須調用Sort方法(注意:當添加新元素時,Sort方法也會在BinarySearch方法之前被調用)。利用這些,二分查找將檢查列表中的中間那個元素,並詢問:你查找的對象是否大於列表中的當前對象?如果是這樣,可知目標對象索引值將在當前對象之前。如果不是,則對象索引值在當前索引之後。二分查找算法保持詢問,直到找到對象為止。恰恰相反,線性搜索從列表中的第一個元素開始查找指定元素,如果不是,則繼續搜索下一個元素,直到在列表中找到相應的元素。

閱讀參考

查看MSDN文檔中的“LinkedList<T> Class”主題。

4.7 創建一個可以被初始化為空的值類型

問題

您有一個數字類型的變量,用於控制從數據庫中獲取的數值。數據庫可能為這個值返回一個null值。您需要一個簡潔的方法來存儲這個數值,甚至它返回為null。

解決方案

使用可空類型。有兩個創建可空類型的方法。第一種方法是使用?類型修飾符:

int? myDBInt = null;

第二種方法是使用Nullable<T>泛型類型:

Nullable<int> myDBInt = new Nullable<int>();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved