熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2022-06-13   來源: .NET編程 

  前言

  前段時間為了查找泛型資料我翻譯了OReilly 出版的《C# Cookbook》這本書的幾個關於泛型的章節其中 反轉Sorted List裡的內容(見 )這一節中有一個接近行代碼的例子當時看到這個例子嚇了一跳這是一個足以讓人頭暈眼花的數字粗略看了一下感覺代碼質量非常高非常值得我們去學習於是決定寫一系列文章分析它象搭積木一樣逐步把這個ReversibleSortedList構建完成

  在讀這一篇文章之前您需要明白一件事如果只在一個項目裡用到這個類有必要花費行代碼去構建它嗎?我個人的觀點是沒有必要FCL(Framework Class Library)中有很多現成的東西拿過來用就行了那還有什麼理由去研究它呢?我提供以下幾點做為參考

  l 想通過閱讀高質量的代碼來提高自己

  l 對FCL如此著迷想通過它邁出第一步

  l 您希望自己的代碼有機會給其他程序員使用換句話說您面向的是程序員您是一個組件編寫者從某一方面說您越麻煩就意味著您的用戶越方便

  呵呵不那麼多疲話了開始工作

  雛形
你想構建一個集合類用於存儲數據它裡面的值是成對出現的每一對值都包含兩個部分鍵和值裡存放的數據類型是不確定的最好什麼類型放到裡面都適用想起了什麼?就是它!泛型!真是太偉大了!

  接下來要考慮的問題是采用什麼樣的方式來存儲這些值你覺得自己的數據結構學得還比較好決定要控制一切在所有集合類型中數組的速度是最快的而且它使用方便並且是類型安全的唯一的缺點就是容量固定好!不管那麼多了用的就是它先把代碼寫出來再說

  public class ReversibleSortedList

  {

  private TKey[] keys; //鍵數組

  private TValue[] values; //值數組

  }

  總算邁出了第一步確定了大的方向但是數組是容量固定的如何能讓它的容量可以隨著元素的增長而自動增長呢?即然要控制容量那就要有一個容量屬性用於讀取和設置容量先從讀取開始容量值就是數組keys或values的長度繼續添加代碼

  public class ReversibleSortedList

  {

  private TKey[] keys; //鍵數組

  private TValue[] values; //值數組

  public int Capacity //容量屬性

  {

  get

  {

  return thiskeysLength;

  }

  }

  }

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

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

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

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

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

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

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

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

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

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

  using System;
using SystemCollections;
using SystemCollectionsGeneric;

  public class ReversibleSortedList
{
#region 成員變量
private TKey[] keys; //鍵數組
private TValue[] values; //值數組
private static TKey[] emptyKeys; //用於鍵數組的初始化
private static TValue[] emptyValues; //用於值數組的初始化
#endregion
#region 構造方法
//類型構造器
static ReversibleSortedList()
{
ReversibleSortedListemptyKeys = new TKey[];
ReversibleSortedListemptyValues = new TValue[];
}
public ReversibleSortedList()
{
thiskeys = ReversibleSortedListemptyKeys;
thisvalues = ReversibleSortedListemptyValues;
}
#endregion
#region 公有屬性
public int Capacity //容量屬性
{
get
{
return thiskeysLength;
}
}
#endregion
}
public class Test
{
static void Main()
{
ReversibleSortedList rs=new ReversibleSortedList();
ConsoleWriteLine(rsCapacity);
}
}

  運行結果

  


From:http://tw.wingwit.com/Article/program/net/201311/11379.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.