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

C# 泛型排序進階:自訂 IComparer 實現多條件排序

     編輯:關於C語言

前言

繼上一篇介紹基本 IComparable<T> 實作後,本文深入探討當單一類別需要支援多種排序規則時,如何透過實作 IComparer<T> 介面實現靈活的排序策略切換。

核心概念:IComparer vs IComparable

List<T>.Sort() 預設會呼叫元素實作的 IComparable<T>.CompareTo() 進行快速排序。但當我們需要「同一組資料、不同排序邏輯」時(如員工既可按工號排序,也可按工齡排序),單一 CompareTo 方法無法滿足需求。此時應建立實作 IComparer<T> 的比較器類別,並傳遞給 Sort(IComparer<T>) 多載方法。

EmployeeComparer 設計詳解

列舉型別定義排序模式

public enum ComparisonType
{
    EmpID,          // 依員工編號
    YearsOfService  // 依工齡
}

比較器屬性與核心比較邏輯

public class EmployeeComparer : IComparer<Employee>
{
    private ComparisonType whichComparison;

    public ComparisonType WhichComparison
    {
        get { return whichComparison; }
        set { whichComparison = value; }
    }

    public int Compare(Employee lhs, Employee rhs)
    {
        // 委派給 Employee 的多參數 CompareTo 方法
        return lhs.CompareTo(rhs, WhichComparison);
    }
    
    // 介面必要成員簡化實作...
}

Employee 類別擴充比較方法

public int CompareTo(Employee rhs, EmployeeComparer.ComparisonType which)
{
    switch (which)
    {
        case EmployeeComparer.ComparisonType.EmpID:
            return this.empID.CompareTo(rhs.empID);
        case EmployeeComparer.ComparisonType.YearsOfService:
            return this.yearsOfSvc.CompareTo(rhs.yearsOfSvc);
    }
    return 0;
}

使用流程示範

  1. 取得比較器實例:EmployeeComparer c = Employee.GetComparer();
  2. 設定排序模式:c.WhichComparison = EmployeeComparer.ComparisonType.EmpID;
  3. 呼叫排序:empArray.Sort(c);
  4. 切換模式再排序:c.WhichComparison = EmployeeComparer.ComparisonType.YearsOfService; empArray.Sort(c);

架構優勢分析

特性說明
關注點分離排序邏輯從資料類別中抽離,符合單一職責原則
執行時期切換同一比較器實例可動態改變排序策略,無需建立新物件
型別安全泛型 IComparer<Employee> 避免型別轉換與 boxing/unboxing
擴充性新增排序欄位只需擴充列舉與 switch case,不修改現有程式碼

自訂集合的型別約束建議

若開發自訂集合類別並需支援排序,建議在泛型定義加入約束:

public class CustomList<T> where T : IComparable<T>
{
    public void Sort() { /* 內部呼叫 T.CompareTo */ }
    public void Sort(IComparer<T> comparer) { /* 使用外部比較器 */ }
}

這確保放入集合的型別皆實作比較介面,編譯期即可檢查型別安全。

總結

透過 IComparer<T> 實作策略模式,配合列舉型別控制排序邏輯,能優雅解決「單一資料類別、多種排序需求」的問題。此設計模式在處理複雜商業實體排序時極為實用,也是 .NET Framework 集合排序機制的核心設計哲學。

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