数组自定义排序:IComparable和IComparer接口
首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法。
Array类使用快速算法对数组中的元素进行排序。sort()方法需要数组中的元素实现IComparable接口,下例演示了一个自定义的排序:
class Program { static void Main(string[] args) { Person[] persons ={ new Person{firstName ="Dsldkjf",lastName="Agjkl"}, new Person{firstName ="gpok",lastName="gjys"}, new Person{firstName ="ugkdf",lastName="Agjkl"}, new Person{firstName ="idfkd",lastName="6dfbh"} }; foreach (var p in persons) { Console.WriteLine(p); } Console.WriteLine("---------------------------------------------"); Array.Sort(persons); foreach (var p in persons) { Console.WriteLine(p); } Console.ReadKey(); } } class Person : IComparable<Person> { public string firstName=string.Empty; public string lastName = string.Empty; public int CompareTo(Person other) { if (other == null) return 1; int result = string.Compare(this.lastName, other.lastName); if (result == 0) { result = string.Compare(this.firstName, other.firstName); } return result; } public override string ToString() { return string.Format("{0} {1}" ,firstName,lastName); } }
结果:
下面实现一个带选择功能的排序:
class Program { static void Main(string[] args) { Person[] persons ={ new Person{firstName ="Dsldkjf",lastName="Agjkl"}, new Person{firstName ="gpok",lastName="gjys"}, new Person{firstName ="ugkdf",lastName="Agjkl"}, new Person{firstName ="idfkd",lastName="6dfbh"} }; foreach (var p in persons) { Console.WriteLine(p); } Console.WriteLine("---------------------------------------------"); Array.Sort(persons,new PersonComparer(PersonComparType.lastName)); foreach (var p in persons) { Console.WriteLine(p); } Console.ReadKey(); } } public struct Person { public string firstName; public string lastName; public override string ToString() { return string.Format("{0} {1}", firstName, lastName); } } public enum PersonComparType { firstName, lastName } public class PersonComparer : IComparer<Person> { private PersonComparType type; public PersonComparer(PersonComparType type) { this.type = type; } public int Compare(Person x, Person y) { //假如Person是一个类的话 需要进行下面判断 //if (x ==null && y == null) return 0; //if (x == null) return 1; //if (y == null) return -1; switch (type) { case PersonComparType.firstName: return string.Compare(x.firstName, y.firstName); case PersonComparType.lastName: return string.Compare(x.lastName, y.lastName); default: throw new ArgumentException("unexpected compare type"); } } }
结果:
浮躁的人容易问:我到底该学什么;----别问,学就对了; 浮躁的人容易问:JS有钱途吗;----建议你去抢银行; 浮躁的人容易说:我要中文版!我英文不行!----不行?学呀! 浮躁的人分两种:只观望而不学的人;只学而不坚持的人; 浮躁的人永远不是一个高手。