说明(2017-7-25 10:38:37):
1. 参照了上一篇百度文库里的文章。
2. 总结来看,Icomparer就是sort方法的一个参数,用来自定义一个排序规则。
3. 使用方法是,定义一个排序类,如PersonComparer,继承Icomparer接口,实现里面的Icomparer方法,用的时候直接sort(new
PersonComparer())就可以了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _03IComparer用法 { class Program { static void Main(string[] args) { List<Person> p = new List<Person>(); p.Add(new Person("张三", 12)); p.Add(new Person("李四", 23)); p.Add(new Person("王五", 43)); p.Add(new Person("赵六", 25)); p.Add(new Person("钱七", 63)); p.Add(new Person("孙八", 23)); p.Add(new Person("孙九", 18)); //排序前 foreach (Person person in p) { person.SayHello(); } Console.WriteLine("________________________"); //按姓名排序,注意sort排序会改变原值! p.Sort(new PersonComparer(PersonComparer.CompareType.Name)); foreach (Person person in p) { person.SayHello(); } Console.WriteLine("________________________"); //按年龄排序 p.Sort(new PersonComparer(PersonComparer.CompareType.Age)); foreach (Person person in p) { person.SayHello(); } Console.ReadKey(); } } //定义Person类 class Person { public Person(string name, int age) { this.Name = name; this.Age = age; } public string Name { get; set; } public int Age { get; set; } //这个地方很多文章用了“public override string ToString()”,重写了ToString方法,返回上面两个属性,我觉得没必要,搞得让人费解,还不如重新起个名,比如SayHello public void SayHello() { Console.WriteLine("我叫{0},今年{1}岁了!", this.Name, this.Age); } } //定义PersonComparer类,其实就是声明一个自定义的排序规则。此处的规则就是,按照名字排序,或者按照成绩排序。 //sort方法,如果无参,使用默认比较器。另外可以使用IComparison,IComparer参数。 class PersonComparer : IComparer<Person> { //定义枚举,方便传参,根据名字还是年龄排序。 public enum CompareType { Name, Age } private CompareType type; public PersonComparer(CompareType type) { this.type = type; } //实现IComparer接口,里面就一个Compare函数,返回int类型 //返回结果:一个带符号整数,它指示 x 与 y 的相对值。小于零,x小于y。零,x等于y。大于零,x大于y。 public int Compare(Person x, Person y) { if (this.type == CompareType.Name) { return x.Name.CompareTo(y.Name); } else { return x.Age.CompareTo(y.Age); } } } }