加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C# 对List<T>进行排序 利用 IComparer<T> 接口实现比较器

(2011-08-09 08:30:27)
标签:

杂谈

分类: silverlight
  对List<T>进行排序

List<T>作为列表,排序也是它的一个基本功能。List<T>可以通过Sort()对列表中的元素进行从小到大排序,同时Sort()还接收自定义比较器,这样开发人员可以根据需要指定希望的比较方式。Sort()方法的3个常用版本的定义如下:

  1. public void Sort();  
  2. public void Sort(IComparer<T> comparer);  
  3. public void Sort(int index,int count,IComparer<T> comparer); 

其中,第1个版本是通过默认的比较器对列表中所有元素进行从小到大排序,如果类型T没有默认比较器,也没有实现接口IComparer<T>,即T不能进行比较,那么会产生异常。参数comparer是一个实现了IComparer<T>接口的类型对象,Sort()通过comparer接口的Compare()对元素进行比较。第3个版本是部分元素进行比较,index表示起始索引(0开始计数),count表示要排序的元素个数。

IComparer<T>接口只有一个成员Compare(T x, T y),通常情况下,如果x小于y返回负数,x等于y返回0,x大于y返回整数。如示例代码4-10中的MyIntComparer类,该类实现接口IComparer<int>,成员Compare(int x, int y)根据x和y的绝对值x和y进行比较。

示例代码4-10演示Sort()方法和IComparer<T>的使用,泛型方法PrintList<T>()用来打印列表中的元素,该函数在后面的例子中会继续使用。在UseSort()方法中,ary是最原始的数据,首先,用默认的比较器对元素按照从小到大排序(负数小于整数)。然后,用自定义整数比较器MyIntComparer对象mic对列表中的元素按照绝对值排序。最后,用mic对列表中第2个开始的3个元素按照绝对值排序。

示例代码4-10

  1. //自定义整数比较器,按照整数的绝对值进行比较  
  2. class MyIntComparer:IComparer<int> 
  3. {  
  4.     //重写int比较器,|x|>|y|返回正数,|x|=|y|返回0,|x|<|y|返回负数  
  5.     public int Compare(int x, int y)  
  6.     {  
  7.         int x1 Math.Abs(x);                   //x的绝对值x1  
  8.         int y1 Math.Abs(y);                   //y的绝对值y1  
  9.         return x1 y1;  
  10.     }  
  11. }  
  12. //在同一行上打印列表中的元素  
  13. static void PrintList<T>(string hint, List<T> lst)  
  14. {  
  15.     System.Console.Write(hint ":");  
  16.     foreach (T val in lst)                     
    //遍历并打印列表中的元素  
  17.     {  
  18.         System.Console.Write("{0} ", val);  
  19.     }  
  20.     System.Console.WriteLine();  
  21. }  
  22. static void UseSort()  
  23. {  
  24.     int[] ary {9, 8, -11, 10, -3, 2};         //准备
    数据,添加到列表中  
  25.     MyIntComparer mic new MyIntComparer();  
  26.     List<int> intLst new List<int>);  
  27.     intLst.AddRange(ary);                       
    //将数据添加到List
    <int>中  
  28.     PrintList<int>("排序前", intLst);          //打印数据  
  29.     intLst.Sort( );                             //使
    用默认比较器进行排序  
  30.     PrintList<int>("默认排序后", intLst);    //打印数据  
  31.     intLst.Clear( );                        //重新准备数据  
  32.     intLst.AddRange(ary);  
  33.     intLst.Sort(mic);                   //用自定义
    的比较器进行排序,即按绝对值排序  
  34.     PrintList<int>("绝对值排序后", intLst);   //打印数据  
  35.     intLst.Clear( );                            //重新准备数据  
  36.     intLst.AddRange(ary);  
  37.     intLst.Sort(2, 3, mic);             //对第2个开始的3
    个元素按绝对值排序  
  38.     PrintList<int>("部分排序后", intLst);        //打印数据  

示例代码4-10的输出如下,默认排序之后元素按照从小到大排序,负数小于0和整数。按绝对排序之后,-3大于2,可见MyIntComparer起作用了。同样部分排序的时候,第0和1两个元素和最后一个元素都没有参与排序。

  1. 排序前:9 -11 10 -3 2  
  2. 默认排序后:-11 -3 10  
  3. 绝对值排序后:2 -3 10 -11  
  4. 部分排序后:9 -3 10 -11 

技巧:如果希望对元素从大到小排序,可以先用Sort()方法对元素从小到大排序,然后再用Reverse()将列表中的元素倒置,就变成从大到小排序

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有