建议10:创建对象时需要考虑是否实现比较器
有对象的地方就会存在比较,在.NET的世界中也一样。举个最简单的例子,在UI中,有一个10个人的Salary列表。根据排序的需要,列表要支持针对基本工资来罗列Salary。这个时候,接口IComparable就会起作用,代码如下所示:
- class Salary : IComparable
- {
- public string Name { get; set; }
- public int BaseSalary { get; set; }
- public int Bonus { get; set; }
- #region IComparable 成员
- public int CompareTo(object obj)
- {
- Salary staff = obj as Salary;
- if (BaseSalary > staff.BaseSalary)
- {
- return 1;
- }
- else if (BaseSalary == staff.BaseSalary)
- {
- return 0;
- }
- else
- {
- return -1;
- }
- //return BaseSalary.CompareTo(staff.BaseSalary);
- }
- #endregion
- }
|
注意:上面代码中CompareTo方法有一条注释的代码,其实本方法完全可以使用该注释代码代替,因为利用了整型的默认比较方法。此处未使用本注释代码,是为了更好地说明比较器的工作原理。
实现了接口IComparable后,我们就可以根据BaseSalary对Salary进行排序了,代码如下所示:
- ArrayList companySalary = new ArrayList();
- companySalary.Add(new Salary() { Name = "Mike", BaseSalary = 3000 });
- companySalary.Add(new Salary() { Name = "Rose", BaseSalary = 2000 });
- companySalary.Add(new Salary() { Name = "Jeffry", BaseSalary = 1000 });
- companySalary.Add(new Salary() { Name = "Steve", BaseSalary = 4000 });
- companySalary.Sort();
- foreach (Salary item in companySalary)
- {
- Console.WriteLine(item.Name + "\t BaseSalary: " + item.BaseSalary.ToString());
- }
|
上面代码的输出如下:
- Jeffry BaseSalary: 1000
- Rose BaseSalary: 2000
- Mike BaseSalary: 3000
- Steve BaseSalary: 4000
|
现在,问题来了:如果不想以基本工资BaseSalary进行排序,而是以奖金Bonus进行排序,该如何处理呢?这个时候,接口IComparer的作用就体现出来了,可以使用IComparer来实现一个自定义的比较器。如下所示:
- class BonusComparer : IComparer
- {
- #region IComparer 成员
- public int Compare(object x, object y)
- {
- Salary s1 = x as Salary;
- Salary s2 = y as Salary;
- return s1.Bonus.CompareTo(s2.Bonus);
- }
- #endregion
- }
|