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中幾個集合類的源代碼 將不再困難,還猶豫什麼,閱讀源代碼將會給您帶來極大的提高!
本文配套源碼