改善C#程序的157个建议(连载10)

发表于:2011-10-25 10:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议10:创建对象时需要考虑是否实现比较器

  有对象的地方就会存在比较,在.NET的世界中也一样。举个最简单的例子,在UI中,有一个10个人的Salary列表。根据排序的需要,列表要支持针对基本工资来罗列Salary。这个时候,接口IComparable就会起作用,代码如下所示:

  1. class Salary : IComparable  
  2. {  
  3.     public string Name { get; set; }  
  4.     public int BaseSalary { get; set; }  
  5.     public int Bonus { get; set; }  
  6.     #region IComparable 成员  
  7.     public int CompareTo(object obj)  
  8.     {  
  9.         Salary staff = obj as Salary;  
  10.         if (BaseSalary > staff.BaseSalary)  
  11.         {  
  12.             return 1;  
  13.         }  
  14.         else if (BaseSalary == staff.BaseSalary)  
  15.         {  
  16.             return 0;  
  17.         }  
  18.         else  
  19.         {  
  20.             return -1;  
  21.         }  
  22.         //return BaseSalary.CompareTo(staff.BaseSalary);  
  23.     }  
  24.     #endregion  
  25. }

  注意:上面代码中CompareTo方法有一条注释的代码,其实本方法完全可以使用该注释代码代替,因为利用了整型的默认比较方法。此处未使用本注释代码,是为了更好地说明比较器的工作原理。

  实现了接口IComparable后,我们就可以根据BaseSalary对Salary进行排序了,代码如下所示:

  1. ArrayList companySalary = new ArrayList();  
  2. companySalary.Add(new Salary() { Name = "Mike"BaseSalary = 3000 });  
  3. companySalary.Add(new Salary() { Name = "Rose"BaseSalary = 2000 });  
  4. companySalary.Add(new Salary() { Name = "Jeffry"BaseSalary = 1000 });  
  5. companySalary.Add(new Salary() { Name = "Steve"BaseSalary = 4000 });  
  6. companySalary.Sort();  
  7. foreach (Salary item in companySalary)  
  8. {  
  9.     Console.WriteLine(item.Name + "\t BaseSalary: " + item.BaseSalary.ToString());  
  10. }

  上面代码的输出如下:

  1. Jeffry   BaseSalary: 1000  
  2. Rose     BaseSalary: 2000  
  3. Mike     BaseSalary: 3000  
  4. Steve    BaseSalary: 4000

  现在,问题来了:如果不想以基本工资BaseSalary进行排序,而是以奖金Bonus进行排序,该如何处理呢?这个时候,接口IComparer的作用就体现出来了,可以使用IComparer来实现一个自定义的比较器。如下所示:

  1. class BonusComparer : IComparer  
  2. {  
  3.     #region IComparer 成员  
  4.     public int Compare(object x, object y)  
  5.     {  
  6.         Salary s1 = x as Salary;  
  7.         Salary s2 = y as Salary;  
  8.         return s1.Bonus.CompareTo(s2.Bonus);  
  9.     }  
  10.     #endregion  
  11. }

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号