1. 程式人生 > WINDOWS開發 >C# 建立物件時需要考慮是否實現比較器

C# 建立物件時需要考慮是否實現比較器

建立物件,有時候需要比較排序輸出,例如一個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個建議》陸敏技