程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 構建可反轉排序的泛型字典類(1)--雛形

構建可反轉排序的泛型字典類(1)--雛形

編輯:關於C#

構建可反轉排序的泛型字典類

前言

前段時間為了查找泛型資料,我翻譯了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;
    }
  }
}

現在問題來了,當ReversibleSortedList被實例化後直接讀取Capacity屬性,將會調用keys.Length屬性來返回。但此時keys並沒有被初始化,肯定不能訪問其Length屬性。可不可以在聲明的同時把它初始化為元素個數為0的數組呢?

private TKey[] keys = new TKey[0]; //鍵數組

這樣做是沒有什麼問題,但它剛聲明就成為了垃圾,什麼都放不了,總讓人感覺不舒服。那可不可以讓數組初始化為一個固定容量呢?

private TKey[] keys = new TKey[4]; //鍵數組

但你是一個完美主義者,不希望這樣就使用了4個位置的空間,你更希望在添加元素時才會有空間的拓展。可不可以聲明兩個靜態的,初始長度為0的數組做為其初始狀態呢?這樣不管類有多少個實例,進行初始化時使用的都是它們。這樣即避免了空間的浪費,也不再需要多次初始化0長度數組。

private static TKey[] emptyKeys; //用於鍵數組的初始化

private static TValue[] emptyValues; //用於值數組的初始化

可以在靜態構造器(又稱類型構造器)裡把它們初始化為長度為0的數組,並在無參實例構造器中把這兩個初始值賦給keys和values數組。

為了測試自己的想法,需要添加Main()方法進行測試,下列代碼可以直接拷貝並運行,如果不知道如何運行,請參考:

http://www.enet.com.cn/eschool /video/c/1.shtml 

ReversibleSortedList 0.1版本:對ReversibleSortedList類的容量進行初始化

using System;
using System.Collections;
using System.Collections.Generic;
public class ReversibleSortedList<TKey, TValue>
{
  #region 成員變量
  private TKey[] keys; //鍵數組
  private TValue[] values; //值數組
  private static TKey[] emptyKeys; //用於鍵數組的初始化
  private static TValue[] emptyValues; //用於值數組的初始化
  #endregion
  #region 構造方法
  //類型構造器
  static ReversibleSortedList()
  {
    ReversibleSortedList<TKey, TValue>.emptyKeys = new TKey[0];
    ReversibleSortedList<TKey, TValue>.emptyValues = new TValue[0];
  }
  public ReversibleSortedList()
  {
    this.keys = ReversibleSortedList<TKey, TValue>.emptyKeys;
    this.values = ReversibleSortedList<TKey, TValue>.emptyValues;
  }
  #endregion
  #region 公有屬性
  public int Capacity //容量屬性
  {
    get
    {
      return this.keys.Length;
    }
  }
  #endregion
}
public class Test
{
  static void Main()
  {
    ReversibleSortedList<int, string> rs=new ReversibleSortedList<int, string>();
    Console.WriteLine(rs.Capacity);
  }
}

運行結果:

0

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