ReversibleSortedList<TKey, TValue> 的核心創新在於 SortDirectionComparer<T> 巢狀類別,它實作 IComparer<T> 並內建升序/降序切換邏輯,配合外層 Sort() 方法實現無需重排序的動態反轉。本文深度解析此機制的完整實現。
public class SortDirectionComparer<T> : IComparer<T>
{
private ListSortDirection _sortDir;
public SortDirectionComparer()
: this(ListSortDirection.Ascending) { }
public SortDirectionComparer(ListSortDirection sortDir)
{
_sortDir = sortDir;
}
public ListSortDirection SortDirection
{
get => _sortDir;
set => _sortDir = value;
}
public int Compare(T lhs, T rhs)
{
int compareResult = lhs.ToString().CompareTo(rhs.ToString());
if (SortDirection == ListSortDirection.Descending)
compareResult *= -1;
return compareResult;
}
}
ToString() 字串比較,適用於任何型別,但效能不如強型別比較。實務中建議傳入強型別 IComparer<TKey>。_sortDir 僅影響比較結果正負號,不改變底層資料順序。SortDirection,但需呼叫 Sort() 才生效。public void Sort()
{
if (_currentSortDirection != _sortDirectionComparer.SortDirection)
{
Array.Reverse(keys, 0, _size);
Array.Reverse(values, 0, _size);
_currentSortDirection = _sortDirectionComparer.SortDirection;
}
}
Comparer.SortDirection = ListSortDirection.DescendingSort()_currentSortDirection 與比較器方向不一致Array.Reverse 就地反轉兩平行陣列(O(n))_currentSortDirection若 Compare 直接依據最新方向回傳結果,現有陣列順序將與新比較邏輯不符,導致二分搜尋、索引操作全部失效。延遲反轉至显式 Sort() 呼叫,保證資料結構與比較邏輯始終一致。
[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 定義...
// 建構子、公有方法、巢狀型別...
}
同時實作泛型與非泛型三大介面組,確保:
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
SortDirectionComparer + Sort() 雙重機制,以「比較器方向旗標」+「陣列就地反轉」實現了極低成本的動態排序切換。此設計展現了:
此模式廣泛適用於需支援多維度排序切換的集合場景(如 UI 表格欄位點擊排序)。