在 .NET 框架中,SortedList 與 SortedList<TKey, TValue> 皆提供自動排序功能,但缺乏內建的「反轉排序」方法。若需切換升冪/降冪順序,往往得重新填入資料。本文介紹一個自訂的 ReversibleSortedList<TKey, TValue> 類別,繼承自泛型 SortedList,並新增 SortDirection 屬性與 Sort() 方法,讓您隨時切換排序方向,無須重建集合。
內部定義巢狀類別 SortDirectionComparer<T> : IComparer<T>,持有 ListSortDirection 列舉(Ascending/Descending)。其 Compare 方法先呼叫預設比較,若為降冪則將結果乘以 -1 即可反轉順序。
建構子初始化比較器並記錄目前方向。當外部設定 Comparer.SortDirection 後,呼叫 Sort() 會檢查方向是否變更;若不同,直接對內部鍵值陣列呼叫 Array.Reverse 完成 O(n) 就地反轉,並更新紀錄方向。
var rsl = new ReversibleSortedList<int, string>();
rsl.Add(2, "2"); rsl.Add(5, "5"); rsl.Add(3, "3"); rsl.Add(1, "1");
// 預設升冪:1, 2, 3, 5
rsl.Comparer.SortDirection = ListSortDirection.Descending;
rsl.Sort();
// 降冪:5, 3, 2, 1
rsl.Add(4, "4"); // 依目前降冪插入:5, 4, 3, 2, 1
rsl.Comparer.SortDirection = ListSortDirection.Ascending;
rsl.Sort(); // 回升冪:1, 2, 3, 4, 5
完整實作約 1300 行,包含所有 IDictionary<TKey, TValue> 介面成員、多種建構子、二分搜尋插入、移除、清除、修剪容量等。核心邏輯集中在:
SortDirectionComparer<T>:封裝方向邏輯Sort():僅在方向改變時 Array.Reverse(keys, values)Add/Insert:使用 Array.BinarySearch 搭配比較器定位位置原始碼結構清晰、註解完整,適合作為自訂集合的參考範本。
ReversibleSortedList 展示了「組合優於繼承」的實務技巧:包裝現有排序邏輯,僅在必要時以 O(n) 反轉陣列,兼顧效能與 API 簡潔性。若您需要雙向排序的關聯式集合,此類別可直接納入專案使用。