首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

ReversibleSortedList 核心架構解析:SortDirectionComparer 與動態排序反轉機制

     編輯:關於C語言

前言

ReversibleSortedList<TKey, TValue> 的核心創新在於 SortDirectionComparer<T> 巢狀類別,它實作 IComparer<T> 並內建升序/降序切換邏輯,配合外層 Sort() 方法實現無需重排序的動態反轉。本文深度解析此機制的完整實現。

SortDirectionComparer<T> 完整實現

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;
    }
}

關鍵設計要點

  1. 委派給 ToString() 比較:預設使用 ToString() 字串比較,適用於任何型別,但效能不如強型別比較。實務中建議傳入強型別 IComparer<TKey>。
  2. 方向旗標控制:_sortDir 僅影響比較結果正負號,不改變底層資料順序。
  3. 屬性可寫入:允許執行期動態修改 SortDirection,但需呼叫 Sort() 才生效。

動態反轉機制:Sort() 方法

public void Sort()
{
    if (_currentSortDirection != _sortDirectionComparer.SortDirection)
    {
        Array.Reverse(keys, 0, _size);
        Array.Reverse(values, 0, _size);
        _currentSortDirection = _sortDirectionComparer.SortDirection;
    }
}

運作流程

  1. 使用者設定 Comparer.SortDirection = ListSortDirection.Descending
  2. 呼叫 Sort()
  3. 檢測 _currentSortDirection 與比較器方向不一致
  4. Array.Reverse 就地反轉兩平行陣列(O(n))
  5. 同步 _currentSortDirection

為何不直接在 Compare 內反轉?

若 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 定義...
    // 建構子、公有方法、巢狀型別...
}

介面實現完整性

同時實作泛型與非泛型三大介面組,確保:

  • 泛型程式碼類型安全
  • 舊版非泛型 API 相容
  • 序列化、偵錯、COM 互操作支援

實際使用範例

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() 雙重機制,以「比較器方向旗標」+「陣列就地反轉」實現了極低成本的動態排序切換。此設計展現了:

  1. 關注點分離:比較邏輯封裝於比較器,資料排列由容器控制
  2. 效能優先:O(n) 反轉優於 O(n log n) 重排序
  3. API 清晰:方向修改與生效分離,避免隱性副作用

此模式廣泛適用於需支援多維度排序切換的集合場景(如 UI 表格欄位點擊排序)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved