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

構建可反轉排序的泛型字典類(9完)--完善

編輯:關於C#

9. 完善

大樓已經蓋好,剩下的工作就是裝修,裝修好就可以入住了 。從本文的題目得知,這是一個可反轉排序的集合類,但我們只實現了降序插入 功能,如果希望把升序轉換為降序該怎麼辦呢?此例的解決方法是聲明一個代表 排序方向的屬性Comparer,並加入一個sort方法,調用sort方法時根據Comparer 屬性進行排序:

private ListSortDirection _currentSortDirection = ListSortDirection.Descending;  
public SortDirectionComparer<TKey> Comparer
  {
     get
    {
      return this._sortDirectionComparer;
    }
  }
  public void Sort()
  {
    // 檢查是否跟現有排序方向相同.
    if (this._currentSortDirection != this._sortDirectionComparer.SortDirection)
    {
       // 如果不同,則進行反轉.
      Array.Reverse (this.keys, 0, this._size);
      Array.Reverse (this.values, 0, this._size);
      // 設置當前排序.
      this._currentSortDirection = this._sortDirectionComparer.SortDirection;
    }
  }

其中SortDirectionComparer類是第二節所聲明的類,請參考:

http://cgbluesky.blog.163.com/blog/static/241235582008113103320 661/

接下來再增加一個剪除多余空間的功能:

//剪除多 余空間
  public void TrimExcess()
  {
    int num1 = (int)(this.keys.Length * 0.9);
    if (this._size < num1)
    {
      this.Capacity = this._size;
    }
}

當然,需要給Capacity屬性添加set方法

public int Capacity //容量屬性
  {
     get
    {
      return this.keys.Length;
     }
    set
    {
       this.InternalSetCapacity(value, true);
    }
  }

注意:這樣的調整空間會導致另外開辟內存以重新存放元素。

好,最後的工作就是增加一些構造方法,比如指定排序方向,指定容量 ,以使得這個集合類的使用更為靈活:

//用於指定排序方向的構 造方法
  public ReversibleSortedList (SortDirectionComparer<TKey> comparer)
    : this()
  {
    if (comparer != null)
    {
       this._sortDirectionComparer = comparer;
       this._currentSortDirection = _sortDirectionComparer.SortDirection;
    }
  }
  //用於指定字典的構造方法
   public ReversibleSortedList(IDictionary<TKey, TValue> dictionary)
    : this(dictionary, (SortDirectionComparer<TKey>)null)
  {
  }
   //用於指定初始容量的構造方法
  public ReversibleSortedList (int capacity)
  {
    if (capacity < 0)
     {
      throw new ArgumentOutOfRangeException(
         "capacity", "Non-negative number required");
    }
    this.keys = new TKey [capacity];
    this.values = new TValue[capacity];
     this._sortDirectionComparer = new SortDirectionComparer<TKey>();
     this._currentSortDirection = _sortDirectionComparer.SortDirection;
  }
  //用於指定字典和排序方向的構造方法
  //這個構 造方法用於在指定集合中創建新的字典類
  public ReversibleSortedList(IDictionary<TKey, TValue> dictionary,
                SortDirectionComparer<TKey> comparer)
    : this((dictionary != null) ? dictionary.Count : 0, comparer)
  {
    if (dictionary == null)
     {
      throw new ArgumentNullException ("dictionary");
    }
     dictionary.Keys.CopyTo(this.keys, 0);
     dictionary.Values.CopyTo(this.values, 0);
     Array.Sort<TKey, TValue>(this.keys, this.values,
                     this._sortDirectionComparer);
     this._size = dictionary.Count;
  }
  //用於指定容量 和排序方向的構造方法
  public ReversibleSortedList(int capacity, SortDirectionComparer<TKey> comparer)
    : this(comparer)
  {
    this.Capacity = capacity;
  }

好!添加測試代碼:

static void Main()
  {
    ReversibleSortedList<string, string> rs = new ReversibleSortedList<string, string>();
    //添 加元素
    rs.Add("3", "a");
     rs.Add("1", "b");
    rs.Add ("2", "c");
    rs.Add("6", "d");
    rs.Add("5", "e");
    rs.Add("4", "f");
    //使用 DictionaryEntry打印鍵/值
    foreach (KeyValuePair<string, string> d in rs)
    {
      Console.WriteLine (d.Key + "  " + d.Value);
    }
     Console.WriteLine("重新排序");
     rs.Comparer.SortDirection = ListSortDirection.Ascending;
     rs.Sort();
    foreach (KeyValuePair<string, string> d in rs)
    {
      Console.WriteLine(d.Key + "  " + d.Value);
    }
  }

運 行結果:

ReversibleSortedList 1.0版本:完成

1  b
2  c
3  a
4  f
5  e
6  d

重新 排序

6      a
5  e
4  f
3  a
2   c
1  b

10. 結束語

從翻譯《C# Cookbook》中 的泛型內容到翻譯《Programming C#》中的泛型內容,再到寫完這篇文章,一共 寫了129頁的Word文檔。當然,這裡有很大一部份是代碼。寫到後面我自己都有 些不耐煩了。呵呵,不管怎麼說,能堅持做完一件事並不容易,現在堅持下來了 總算是對自己有個交待,也值得慶賀。

讀完這一系列文章,您應該對FCL 中幾個重要的集合接口已經非常熟悉了吧。現在去看FCL中幾個集合類的源代碼 將不再困難,還猶豫什麼,閱讀源代碼將會給您帶來極大的提高!

本文配套源碼

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