C# 建立物件時需要考慮是否實現比較器
阿新 • • 發佈:2020-06-20
建立物件,有時候需要比較排序輸出,例如一個Salary列表,可以支援針對基本工資來羅列,也可以針對獎金來羅列,這個時候就要用到IComparable介面和IComparer介面:
1 //IComparable:比較當前物件和同一型別的另一物件。 2 class Salary : IComparable<Salary> 3 { 4 public string Name { get; set; } 5 public int BaseSalary { get; set; } 6 public int Bonus { get; set; } 7 8 //實現IComparable介面的預設比較器,比較BaseSalary 9 public int CompareTo(Salary other) 10 { 11 return BaseSalary.CompareTo(other.BaseSalary); 12 } 13 } 14 15 //IComparer:定義型別為比較兩個物件而實現的方法。 16 class BonusComparer : IComparer<Salary> 17 {18 //實現IComparer介面的非預設比較器,比較Bonus 19 public int Compare(Salary s1,Salary s2) 20 { 21 return s1.Bonus.CompareTo(s2.Bonus); 22 } 23 }
Salary類繼承了IComparable介面,實現了IComparable的成員CompareTo方法,比較不同物件的BaseSalary;BonusComparer類繼承IComparer介面,實現了IComparer的成員Compare方法,比較兩個Salary物件的Bonus。(使用泛型,可以避免執行時轉型對效能的影響)。
實現了IComparable介面,就可以對Salary列表進行排序了:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 List<Salary> companySalary = new List<Salary>() 6 { 7 new Salary(){Name="Mike",BaseSalary=3000,Bonus=1000}, 8 new Salary(){Name="Rose",BaseSalary=2000,Bonus=4000}, 9 new Salary(){Name="Jeffry",BaseSalary=1000,Bonus=6000},10 new Salary(){Name="Steve",BaseSalary=4000,Bonus=3000},11 }; 12 13 Console.WriteLine("初始排序:"); 14 foreach (Salary item in companySalary) 15 { 16 Console.WriteLine(String.Format("Name:{0}\tBaseSaraly:{1}\tBonus:{2}",item.Name,item.BaseSalary,item.Bonus)); 17 } 18 19 companySalary.Sort();//預設比較器排序 20 Console.WriteLine("預設比較器排序(按BaseSalary):"); 21 foreach (Salary item in companySalary) 22 { 23 Console.WriteLine(String.Format("Name:{0}\tBaseSaraly:{1}\tBonus:{2}",item.Bonus)); 24 } 25 26 companySalary.Sort(new BonusComparer());//提供一個非預設比較器 27 Console.WriteLine("非預設比較器排序(按Bonus):"); 28 foreach (Salary item in companySalary) 29 { 30 Console.WriteLine(String.Format("Name:{0}\tBaseSaraly:{1}\tBonus:{2}",item.Bonus)); 31 } 32 Console.Read(); 33 } 34 }
輸出結果:
初始排序,按初始化時的新增順序輸出結果;預設比較器排序,呼叫Sort方法對Salary列表排序,預設是按BaseSalary從小到大排;非預設比較器排序,給Sort方法提供了BonusComparer類的比較方法,按Bonus從小到大排序。
參考:《編寫高質量程式碼改善C#程式的157個建議》陸敏技