众所周知在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()方法来比较一对对象,从而得出在有序列表中哪个对象在前面。

    首先我们给出利用第一种方法实现自定义类型列表排序的例子:

 

  1. public class Person : IComparable<Person> 
  2.     public int Height; 
  3.     public int age; 
  4.     public string name; 
  5.  
  6.     public int CompareTo(Person person1) 
  7.     { 
  8.         if(this.Height > person1.Height) 
  9.             return 1; 
  10.         else if(this.Height < person1.Height) 
  11.             return -1; 
  12.         else 
  13.             return 0; 
  14.     } 

    注意在实现IComparable接口时要通过<T>来给出需要比较的对象类型。

   这里是按照大小个排序,根据CompareTo函数返回的int数值来判断当前对象和比较对象谁应该在前面。这种做法的好处就是简单,直接在类的内部就把判断的标准写好,不用再理会一些复杂的接口啊  比较类 等等复杂的关系了。

    接下来介绍另外一种排序方式,看起来复杂了很多,但是功能更为强劲。

 

  1. public class PersonComparer : IComparer<Person>  
  2. {  
  3.     public enum SortCriteria  
  4.     {  
  5.         Height,  
  6.         Age,  
  7.     }  
  8.     public SortCriteria SortBy = SortCriteria.Height;  
  9.       
  10.     public int Compare(Person person1, Person person2)  
  11.     {  
  12.         if(SortBy == SortCriteria.Height)  
  13.         {  
  14.             if(person1.Height > person2.Height)  
  15.                 return 1;  
  16.             else if(person1.Height < person2.Height)  
  17.                 return -1;  
  18.             else  
  19.             {  
  20.                 if(person1.Age > person2.Age)  
  21.                     return 1;  
  22.                 else if(person1.Age < person2.Age)  
  23.                     return -1;  
  24.                 else   
  25.                     return 0;  
  26.             }  
  27.         }  
  28.           
  29.         else  
  30.         {  
  31.                 if(person1.Age > person2.Age)  
  32.                     return 1;  
  33.                 else if(person1.Age < person2.Age)  
  34.                     return -1;  
  35.                 else   
  36.                 {  
  37.                     if(person1.Height > person2.Height)  
  38.                         return 1;  
  39.                     else if(person1.Height < person2.Height)  
  40.                        return -1;  
  41.                     else   
  42.                        return 0;  
  43.                 }  
  44.         }  
  45.     }  
  46. }  
  47.   
  48. List<Person> people = new List<Person>(){.....};
  49. PersonComparer pc = new PersonComparer();
  50. pc.SortBy = PersonComparer.SortCriteria.Height;  
  51. people.Sort(pc);
  52. pc.SortBy = PersonComparer.SortCriteria.Age;  
  53. people.Sort(pc);  

    这种方式实现起来虽然麻烦一些,但是功能上绝对强大。木哈哈