众所周知在C#中利用数组处理大量数据时,我们有一种更好的选择。.net framework为我们提供了比数组更方便更简单的List列表(性能上当然落后于数组)。
比较一下数组和List,List能更好的控制插入和删除,得益于动态伸缩的特性,List不需要人为的管理空间大小。更好的是他封装了一系列我们常用的操作数据的函数。例如:查找,删除,判断是否包含。这些功能相对简单易用。而本文主要介绍的是List中一个比麻烦的问题,两个List的比较。
每个List都已经提供了一个内建的Sort()方法,他可以对大部分的内建类型进行排序而不需要我们编写任何代码。但是由于List是一种泛型容器,他可以承载任何的数据类型,包括自定义的类等等。这样难免有时候Sort()也无法简单的进行排序。这时就需要我们出手干预了。
List.Sort()方法已经知道如何对实现了IComparable接口的类或类型进行排序。这个接口只有一个成员,即CompareTo()方法。Sort()使用一个对象的CompareTo()方法与其他对象比较,并使用其返回值(一个int)来确定哪一个在前。
但是有时候需要对某个对象列表排序,而这些对象并没有实现IComparable接口,例如大部分我们自定义的类。对此.NET有另一个接口来提供帮助。可以向Sort()传入实现了IComparer的一个类的实例(即比较对象comparer)。这个接口也只有一个方法。List的Sort()方法使用这个比较对象的Compare()方法来比较一对对象,从而得出在有序列表中哪个对象在前面。
首先我们给出利用第一种方法实现自定义类型列表排序的例子:
- public class Person : IComparable<Person>
- {
- public int Height;
- public int age;
- public string name;
- public int CompareTo(Person person1)
- {
- if(this.Height > person1.Height)
- return 1;
- else if(this.Height < person1.Height)
- return -1;
- else
- return 0;
- }
- }
注意在实现IComparable接口时要通过<T>来给出需要比较的对象类型。
这里是按照大小个排序,根据CompareTo函数返回的int数值来判断当前对象和比较对象谁应该在前面。这种做法的好处就是简单,直接在类的内部就把判断的标准写好,不用再理会一些复杂的接口啊 比较类 等等复杂的关系了。
接下来介绍另外一种排序方式,看起来复杂了很多,但是功能更为强劲。
- public class PersonComparer : IComparer<Person>
- {
- public enum SortCriteria
- {
- Height,
- Age,
- }
- public SortCriteria SortBy = SortCriteria.Height;
- public int Compare(Person person1, Person person2)
- {
- if(SortBy == SortCriteria.Height)
- {
- if(person1.Height > person2.Height)
- return 1;
- else if(person1.Height < person2.Height)
- return -1;
- else
- {
- if(person1.Age > person2.Age)
- return 1;
- else if(person1.Age < person2.Age)
- return -1;
- else
- return 0;
- }
- }
- else
- {
- if(person1.Age > person2.Age)
- return 1;
- else if(person1.Age < person2.Age)
- return -1;
- else
- {
- if(person1.Height > person2.Height)
- return 1;
- else if(person1.Height < person2.Height)
- return -1;
- else
- return 0;
- }
- }
- }
- }
- List<Person> people = new List<Person>(){.....};
- PersonComparer pc = new PersonComparer();
- pc.SortBy = PersonComparer.SortCriteria.Height;
- people.Sort(pc);
- pc.SortBy = PersonComparer.SortCriteria.Age;
- people.Sort(pc);
这种方式实现起来虽然麻烦一些,但是功能上绝对强大。木哈哈