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

C# 泛型進階:打造可反轉排序的 SortedList

     編輯:關於C#

前言

在 .NET 框架中,SortedList 與 SortedList<TKey, TValue> 皆提供自動排序功能,但缺乏內建的「反轉排序」方法。若需切換升冪/降冪順序,往往得重新填入資料。本文介紹一個自訂的 ReversibleSortedList<TKey, TValue> 類別,繼承自泛型 SortedList,並新增 SortDirection 屬性與 Sort() 方法,讓您隨時切換排序方向,無須重建集合。

核心設計

1. 排序方向比較器

內部定義巢狀類別 SortDirectionComparer<T> : IComparer<T>,持有 ListSortDirection 列舉(Ascending/Descending)。其 Compare 方法先呼叫預設比較,若為降冪則將結果乘以 -1 即可反轉順序。

2. 動態切換與就地重排

建構子初始化比較器並記錄目前方向。當外部設定 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 搭配比較器定位位置

原始碼結構清晰、註解完整,適合作為自訂集合的參考範本。

適用場景

  • 需頻繁在升冪/降冪之間切換顯示順序的 UI 綁定資料源
  • 避免重新插入大量資料造成效能損耗
  • 教學示範:如何擴充現有集合並保持介面相容性

小結

ReversibleSortedList 展示了「組合優於繼承」的實務技巧:包裝現有排序邏輯,僅在必要時以 O(n) 反轉陣列,兼顧效能與 API 簡潔性。若您需要雙向排序的關聯式集合,此類別可直接納入專案使用。

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