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

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

編輯:關於C語言

ReversibleSortedList<TKey, TValue>包含一個實現了IComparer<T>接口的嵌套類SortDirectionComparer<T>。這個類可以在“討論”這一節中的ReversibleSortedList<TKey, TValue>代碼中看到。一個實現了IComparer<T>接口的類可以做為ReversibleSortedList<TKey, TValue>構造方法的參數來改變默認的排序。IComparer<T>接口實現了Compare方法:

class Program
  {
    public int Compare(T lhs, T rhs)
    {
      int compareResult =
        lhs.ToString().CompareTo(rhs.ToString());
      // 如果為降序, 則反轉
      if (SortDirection == ListSortDirection.Descending)
        compareResult *= -1;
      return compareResult;
    }
}

Compare方法使用了SortDirectionComparer<T>類的SortDirection屬性來決定項的排序。這個屬性在ReversibleSortedList<TKey, TValue>的內部類SortDirectionComparer<T>實例中被設置。SortDirection屬性是在構造方法中被設置的,代碼如下:

public ReversibleSortedList()
  {
    this.keys = ReversibleSortedList<TKey, TValue>.emptyKeys;
    this.values = ReversibleSortedList<TKey, TValue>.emptyValues;
    this._size = 0;
    this._sortDirectionComparer = new SortDirectionComparer<TKey>();
    this._currentSortDirection = this._sortDirectionComparer.SortDirection;
}

這允許它在指定時間內反轉排列順序,但並沒有重排列表中已存在的項。為了實現這個功能,需要在Reversible-SortedList<TKey, TValue>類中添加一個新的Sort()方法以重排列表。代碼如下:

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;
   }
}

討論

例4-3是ReversibleSortedList<TKey, TValue>類的所有代碼:

(譯者注:這個類的代碼很恐怖,接近1300行,不過代碼很規范,感覺應該是商業代碼,非常值得借鑒。將來有時間我會專門寫文章分析它。請關注:我的博客:http://cgbluesky.blog.163.com/)

例4-3 ReversibleSortedList類

[Serializable, ComVisible(false), DebuggerDisplay("Count = {Count}")]
public class ReversibleSortedList<TKey, TValue> :
    IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>,
    IEnumerable<KeyValuePair<TKey, TValue>>,
    IDictionary, ICollection, IEnumerable
{
  SortDirectionComparer類定義#region SortDirectionComparer類定義
  public class SortDirectionComparer<T> : IComparer<T>
  {  //ListSortDirection 枚舉,有兩個值:
    //Ascending按升序排列,Descending按降序排列
    private System.ComponentModel.ListSortDirection _sortDir;
    //構造方法
    public SortDirectionComparer()
    {  //默認為升序
      _sortDir = ListSortDirection.Ascending;
    }
    //重載構造方法
    public SortDirectionComparer(ListSortDirection sortDir)
    {
      _sortDir = sortDir;
    }
    //排序方向屬性
    public System.ComponentModel.ListSortDirection SortDirection
    {
      get { return _sortDir; }
      set { _sortDir = value; }
    }
    //實現IComparer<T>接口的方法
    public int Compare(T lhs, T rhs)
    {
      int compareResult =
        lhs.ToString().CompareTo(rhs.ToString());

      // If order is DESC, reverse this comparison.
      if (SortDirection == ListSortDirection.Descending)
        compareResult *= -1;
      return compareResult;
    }
  }
  #endregion // SortDirectionComparer

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