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

C# 介面實作深度解析:IComparable 與 IComparer 靈活排序策略

     編輯:關於C#

場景:Employee 類別需要多種排序方式

預設實作 IComparable<Employee> 只能有一種排序邏輯(如依 EmpID)。若需依「工齡」或其他欄位排序,必須引入 IComparer<T> 外部比較器。

9.6.1 實作 IComparable<T>:預設排序

public class Employee : IComparable<Employee> {
    public int EmpID { get; set; }
    public int CompareTo(Employee other) => this.EmpID.CompareTo(other.EmpID);
}

List<Employee>.Sort() 會自動呼叫此方法進行快速排序。

9.6.2 實作 IComparer<T>:多重排序策略

步驟 1:定義比較類型枚舉

public enum ComparisonType { EmpID, YearsOfService }

步驟 2:實作比較器巢狀類別

public class EmployeeComparer : IComparer<Employee> {
    public ComparisonType WhichComparison { get; set; }
    public int Compare(Employee x, Employee y) =>
        x.CompareTo(y, WhichComparison); // 委託給 Employee 多載
}

步驟 3:Employee 擴充多載 CompareTo

public int CompareTo(Employee other, ComparisonType type) {
    return type == ComparisonType.EmpID
        ? this.EmpID.CompareTo(other.EmpID)
        : this.YearsOfSvc.CompareTo(other.YearsOfSvc);
}

步驟 4:使用者端切換策略

var cmp = Employee.GetComparer();
cmp.WhichComparison = ComparisonType.EmpID;
empList.Sort(cmp); // 依 ID 排序

cmp.WhichComparison = ComparisonType.YearsOfService;
empList.Sort(cmp); // 依工齡排序

完整輸出範例

// 原始隨機
ID: 103, Years: 11
ID: 108, Years: 15
ID: 107, Years: 14
ID: 108, Years: 5
ID: 102, Years: 0

// 依 EmpID
ID: 102, Years: 0
ID: 103, Years: 11
ID: 107, Years: 14
ID: 108, Years: 15
ID: 108, Years: 5

// 依 YearsOfService
ID: 102, Years: 0
ID: 108, Years: 5
ID: 103, Years: 11
ID: 107, Years: 14
ID: 108, Years: 15

設計模式對應

此為策略模式在排序領域的經典應用:

  • IComparable = 內建預設策略
  • IComparer = 外部可換裝策略
  • ComparisonType = 策略參數化

進階提示

  • .NET Core 2.0+ 可用 Comparer<T>.Create((x,y)=>…) 以 Lambda 簡寫比較器。
  • 若集合本身實作 IEnumerable<T>,亦可用 LINQ OrderBy/ThenBy 達成同樣效果且更具可讀性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved