構建可反轉排序的泛型字典類
前言
前段時間為了查找泛型資料,我翻譯了O'Reilly 出版的《C# Cookbook》這本書的幾個關於泛型的章節。其中“4.8 反轉Sorted List裡的內容”(見
http://cgbluesky.blog.163.com/blog/static/2412355820081211016581/ )這一節中有一個接近1300行代碼的例子。當時看到這個例子嚇了一跳,這是一個足以讓人頭暈眼花的數字。粗略看了一下,感覺代碼質量非常高,非常值得我們去學習。於是決定寫一系列文章分析它,象搭積木一樣逐步把這個ReversibleSortedList構建完成。
在讀這一篇文章之前,您需要明白一件事:如果只在一個項目裡用到這個類,有必要花費1300行代碼去構建它嗎?我個人的觀點是沒有必要。FCL(Framework Class Library)中有很多現成的東西,拿過來用就行了。那還有什麼理由去研究它呢?我提供以下幾點做為參考:
l 想通過閱讀高質量的代碼來提高自己。
l 對FCL如此著迷,想通過它邁出第一步。
l 您希望自己的代碼有機會給其他程序員使用,換句話說,您面向的是程序員,您是一個組件編寫者。從某一方面說,您越麻煩,就意味著您的用戶越方便。
呵呵,不那麼多疲話了,開始工作。
雛形
你想構建一個集合類用於存儲數據,它裡面的值是成對出現的,每一對值都包含“鍵”和“值”兩個部分。鍵和值裡存放的數據類型是不確定的,最好什麼類型放到裡面都適用。想起了什麼?就是它!泛型!真是太偉大了!
接下來要考慮的問題是采用什麼樣的方式來存儲這些值,你覺得自己的數據結構學得還比較好,決定要控制一切。在所有集合類型中,數組的速度是最快的,而且它使用方便並且是類型安全的,唯一的缺點就是容量固定。好!不管那麼多了,用的就是它。先把代碼寫出來再說。
public class ReversibleSortedList<TKey, TValue>
{
private TKey[] keys; //鍵數組
private TValue[] values; //值數組
}
總算邁出了第一步,確定了大的方向。但是數組是容量固定的,如何能讓它的容量可以隨著元素的增長而自動增長呢?即然要控制容量,那就要有一個容量屬性,用於讀取和設置容量。先從讀取開始,容量值就是數組keys或values的長度。好,繼續添加代碼:
public class ReversibleSortedList<TKey, TValue>
{
private TKey[] keys; //鍵數組
private TValue[] values; //值數組
public int Capacity //容量屬性
{
get
{
return this.keys.Length;
}
}
}