IComparable与IComparer

来源:互联网 发布:linux dhcp命令 编辑:程序博客网 时间:2024/06/08 12:11

1.当我们要对集合进行排序时,集合中的元素必须要是一类元素,且元素的类型实现了IComparable接口

            ArrayList arr = new ArrayList() { 0, 8, 32, 4, 2, 432, 5, 234, 54323, 875, 45 };            arr.Sort();            for (int i = 0; i < arr.Count; i++)            {                Console.Write("{0} ",arr[i]);            }            Console.ReadKey();

结果是:

...............................................................

0 2 4 5 8 32 45 234 432 875 54323

这是因为int类型继承了IComparable接口,因此可以排序



2.那么我们是否可以为自定义的类型进行排序呢,答案是一定的

我们想为Person这个类按照某种条件进行排序,那么首先它必须实现Icomparable接口,以及实现这个接口中的方法CompareTo

 class Person : IComparable  {        public string Name { get; set; }        public int Age { get; set; }        public int CompareTo(object obj)        {            Person p = obj as Person;            if (p == null)            {                throw new ArgumentException();            }            else            {                return this.Age-p.Age;                //return this.Name.Length - p.Name.Length;            }        }   }
按照年龄进行升序排序
ArrayList arr = new ArrayList() {            new Person(){ Name="Alice Wang", Age=19},            new Person(){ Name="Wayen Li", Age=12},            new Person(){ Name="Chris Sun", Age=21},            new Person(){ Name="Jerry Huang", Age=22}            };            Console.WriteLine("排序之前:");            for (int i = 0; i < arr.Count; i++)            {                Console.WriteLine(((Person)arr[i]).Name);            }            //IComparable            //升序排序            arr.Sort();            Console.WriteLine("排序之后:");            for (int i = 0; i < arr.Count; i++)            {                Console.WriteLine(((Person)arr[i]).Name);            }            Console.ReadKey();

结果是:

.........................................................................

Wayen    Li
Alice     Wang
Chris    Sun
Jerry    Huang

如果按照名字的长度进行排序的话,结果是

.........................................................................

Wayen    Li
Chris     Sun
Alice     Wang
Jerry    Huang

3.我们也可以定义一个类,继承自IComparer接口,用作比较器

    class Person     {        public string Name { get; set; }        public int Age { get; set; }    }    class PersonSortByAgeAsc : IComparer    {        #region IComparer 成员        public int Compare(object x, object y)        {            Person p1 = x as Person;            Person p2 = y as Person;            if (p1 != null && p2 != null)            {                return p1.Age - p2.Age;            }            else            {                throw new ArgumentException();            }        }        #endregion    }
按年龄大小进行升序排列

            ArrayList arr = new ArrayList() {            new Person(){ Name="Alice Wang", Age=19},            new Person(){ Name="Wayen Li", Age=12},            new Person(){ Name="Chris Sun", Age=21},            new Person(){ Name="Jerry Huang", Age=22}            };
 //按照年龄升序排序            arr.Sort(new PersonSortByAgeAsc());            for (int i = 0; i < arr.Count; i++)            {                Console.WriteLine(((Person)arr[i]).Name);            }           Console.ReadKey();
结果是:

.........................................................................

Wayen    Li
Alice     Wang
Chris    Sun
Jerry    Huang

0 0
原创粉丝点击