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

構建可反轉排序泛型字典類(2)--排序方向

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

   排序方向

  你希望ReversibleSortedList類中的元素是以TKey(鍵)的順序進行存儲的並且它即可以從小排到大也可以從大排到小當然最佳方式就是在添加元素時找到合適的位置插入插入後元素就已經按順序排好在一個有序數組中查找合適的插入點這樣的算法並不困難但FCL已經幫我們實現了而且是采用速度最快的二分查找法(在MSDN中被稱為二進制搜索法太棒了!它就是靜態方法ArrayBinarySearch下面我們來看MSDN中對它的介紹

  ArrayBinarySearch一共有個重載版本最後一個是我們需要的

  public static int BinarySearch (
T[] array //要搜索的從零開始的一維排序 Array
int index //要搜索的范圍的起始索引
int length //要搜索的范圍的長度
T value //要搜索的對象
IComparer comparer //比較元素時要使用的 IComparer 實現
)

  其中T表示數組元素的類型對返回值的介紹是如果找到 value則為指定 array 中的指定 value 的索引如果找不到 value 且 value 小於 array 中的一個或多個元素則為一個負數該負數是大於 value 的第一個元素的索引的按位求補如果找不到 value 且 value 大於 array 中的任何元素則為一個負數該負數是最後一個元素的索引加 的按位求補

  我們的ReversibleSortedList不能插入重復的鍵值當返回值大於或等於表明不能插入當返回值小於零時表明沒有找到重復鍵而且這時返回值還帶有插入位置的信息考慮得可真周到啊贊一個!

  求補是什麼呢?就是把二進制數的變成變成對於int來說由於它是有符號整數求補會把正數變為負數把負數變為正數對一個數進行兩次求補運算就會得到原來的數哈哈如果反回值小於對它求補就可以得到插入位置信息了真是得來全不費工夫!

  現在的問題是需要一個實現了IComparer接口的類可以在ReversibleSortedList聲明一個嵌套類以解決這個問題當然在實現IComparer接口的Compare方法時在裡面做些手腳就可以實現正向和反向排序了這時需要一個能表示正向和反向排序的東西FCL裡有現成的它就是SystemComponentModel命名空間下的 ListSortDirection枚舉它有兩個值Ascending表示升序Descending表示降序下面的代碼在版本的基礎上添加了實現IComparer接口的內部類SortDirectionComparer代碼可直接拷貝運行運行它純粹是為了檢查是否有錯誤沒有什麼看得見的效果

  ReversibleSortedList 版本添加了實現IComparer接口的內部類

  using System;
using SystemCollections;
using SystemCollectionsGeneric;
using SystemComponentModel;

  public class ReversibleSortedList
{
#region 成員變量
private TKey[] keys=new TKey[]; //鍵數組
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
#region SortDirectionComparer類定義
public class SortDirectionComparer : IComparer
{ //ListSortDirection 枚舉有兩個值
//Ascending按升序排列Descending按降序排列
private SystemComponentModelListSortDirection _sortDir;
//構造方法
public SortDirectionComparer()
{ //默認為升序
_sortDir = ListSortDirectionAscending;
}
//可指定排序方向的構造方法
public SortDirectionComparer(ListSortDirection sortDir)
{
_sortDir = sortDir;
}
//排序方向屬性
public SystemComponentModelListSortDirection SortDirection
{
get { return _sortDir; }
set { _sortDir = value; }
}
//實現IComparer接口的方法
public int Compare(T lhs T rhs)
{
int compareResult =
lhsToString()CompareTo(rhsToString());
// 如果是降序則反轉
if (SortDirection == ListSortDirectionDescending)
compareResult *= ;
return compareResult;
}
}
#endregion
}
public class Test
{
static void Main()
{
ReversibleSortedList rs=new ReversibleSortedList();
ConsoleWriteLine(rsCapacity);
}
}


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