Array类实现了对数组中元素的冒泡排序。Sort()方法需要数组实现IComparable接口。简单类型,如System.String和System.Int32实现了IComparable接口,所以可以对包含这些类型的元素排序。
在下面例子中,数组name包含string类型的元素,这个数组是可以排序的。
String[] names = { "Christina Aguillera", "Shakira", "Beyonce", "Gwen Stefani" }; Array.Sort(names); foreach(string name in names) { Console.WriteLine(name); }
该应用程序的输出是排序好得数组:
Beyonce
Christina Aguillera
Gwen Stefani
Shakira
如果对数组使用定制的类,就必须实现IComparable接口。这个接口之定义了一个方法CompareTo(),如果要比较的对象相等,该方法就返回0。如果实力应排在参数对象的前面,该方法就返回小于0的值。如果实例应排在参数对象的后面,该方法就返回大于0的值。
定义一个Person类,使之执行IComparable接口。对LastName的值进行比较。LastName是string类型,而String类已经实现了IComparable接口,所以可以使用String类中CompareTo()方法的实现代码。如果LastName的值相同,就比较FirstName:
public class Person:IComparable { public int CompareTo(object obj) { Person other = obj as Person; int result = this.LastName.CompareTo(other.LastName); if(result ==0) //如果LastName的值相同,就比较FirstName { result = this.FirstName.CompareTo(other.FirstName); } return result; } }
如果Person对象的排序方式与上述不同,或者不能修改在数组中用作元素的类,就可以执行IComparer接口。这个接口定义了方法Compare()。IComparable接口必须由要比较的类来执行,而IComparer接口独立于要比较的类。这就是Compare()方法定义了两个要比较的变元的原因。其返回值与IComparable接口的CompareTo()方法类似。
类Personcomparer实现了IComparer接口,可以按照firstName或LastName对Person对象排序。枚举PersonCompareType定义了与PersonComparer相当的排序选项:FirstName和LastName。排序的方式有类PersonComparer的构造函数定义,在该构造函数中设置了一个PersonCompareType值。Compare()方法用一个switch语句指定是按照firstName还是lastName排序。
public class PersonComparer : IComparer { public enum PersonCompareType { FirstName, LastName } private PersonCompareType compareType; public PersonComparer(PersonCompareType compareType) { this.compareType = compareType; } #region IComparer Members public int Compare(object x, object y) { Person p1 = x as Person; Person p2 = y as Person; switch (compareType) { case PersonCompareType.FirstName: return p1.FirstName.CompareTo(p2.FirstName); case PersonCompareType.LastName: return p1.LastName.CompareTo(p2.LastName); default: throw new ArgumentException("unexpected compare type"); } } #endregion }
现在,可以将一个PersonComparer对象传送给Array.Sort()方法的第二个变元(public static void Sort(Array array, IComparer comparer);)。下面是按名字对Persons数据排序:
Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.FirstName)); foreach (Person p in persons) { Console.WriteLine(p); }
Persons数组现在按名字排序:
Ayrton senna
Emerson Fittipaldi
Michael Schumacher
Niki Lauda
IComparable<T>: