创建对象,有时候需要比较排序输出,例如一个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.Name, item.BaseSalary, 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.Name, item.BaseSalary, item.Bonus)); 31 } 32 Console.Read(); 33 } 34 }
输出结果:
初始排序,按初始化时的添加顺序输出结果;默认比较器排序,调用Sort方法对Salary列表排序,默认是按BaseSalary从小到大排;非默认比较器排序,给Sort方法提供了BonusComparer类的比较方法,按Bonus从小到大排序。
参考:《编写高质量代码改善C#程序的157个建议》陆敏技