4.8 反轉Sorted List裡的內容
問題
您希望在數組和列表類型中可以反轉sorted list裡的內容同時又維持SortedList和SortedList<T>類原來的功能。無論是SortedList還是泛型SortedList<T>類都直接提供了完成這個功能的方法而又不需要重填列表。
解決方案
ReversibleSortedList<TKey, TValue>類提供了這些功能,它基於SortedList<TKey, TValue>類,所以擁有相同的功能,它提供了額外的功能是很容易反轉已排序的列表。
在實例化ReversibleSortedList<TKey, TValue>之後,鍵是整數類型,值是字符串類型,一連串無序的數字和它們的文本表達被插入到列表中。這些項目是這樣顯示的:
ReversibleSortedList<int, string> rsl = new ReversibleSortedList<int, string>();
rsl.Add(2, "2");
rsl.Add(5, "5");
rsl.Add(3, "3");
rsl.Add(1, "1");
foreach (KeyValuePair<int, string> kvp in rsl)
{
Debug.WriteLine("\t" + kvp.Key + "\t" + kvp.Value);
}
列表輸出顯示為按升序排序(默認):
1 1 2 2 3 3 5 5
現在排列順序通過設置ReversibleSortedList的SortDirection屬性被反轉為降序。為了重新排序需要調用Sort()方法。結果如下:
// 轉換排序方向.
rsl.Comparer.SortDirection = ListSortDirection.Descending;
// 重排列表.
rsl.Sort();
foreach (KeyValuePair<int, string> kvp in rsl)
{
Debug.WriteLine("\t" + kvp.Key + "\t" + kvp.Value);
}
這一次,輸出為降序:
5 5 3 3 2 2 1 1
當把一個新項添加進列表,它將按當前的排列順序被添加進去,但在添加完所有項後馬上進行反轉,就可以保持列表中元素的順序。
rsl.Add(4, "4"); foreach (KeyValuePair<int, string> kvp in rsl) { Debug.WriteLine("\t" + kvp.Key + "\t" + kvp.Value); } // 轉換排序方向. rsl.Comparer.SortDirection = ListSortDirection.Ascending; // 重排列表. rsl.Sort(); foreach (KeyValuePair<int, string> kvp in rsl) { Debug.WriteLine("\t" + kvp.Key + "\t" + kvp.Value); }
可以看到新項即按降序也按升序排列:
5 5 4 4 3 3 2 2 1 1 1 1 2 2 3 3 4 4 5 5