C# 对List<T>进行排序 利用 IComparer<T> 接口实现比较器
(2011-08-09 08:30:27)
标签:
杂谈 |
分类: silverlight |
List<T>作为列表,排序也是它的一个基本功能。List<T>可以通过Sort()对列表中的元素进行从小到大排序,同时Sort()还接收自定义比较器,这样开发人员可以根据需要指定希望的比较方式。Sort()方法的3个常用版本的定义如下:
- public
void Sort(); - public
void <T>Sort(IComparer comparer); - public
void <T>Sort(int index,int count,IComparer 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
- //自定义整数比较器,按照整数的绝对值进行比较
- class
MyIntComparer:IComparer <int> - {
-
//重写int比较器,|x| -
public int Compare(int x, int y) -
{ -
int = Math.Abs(x);//x的绝对值x1 -
int = Math.Abs(y);//y的绝对值y1 -
return x1 - y1; -
} - }
- //在同一行上打印列表中的元素
- static
void <T>(stringPrintList hint, <T>List lst) - {
-
System.Console.Write(hint + ":"); -
foreach (T val in lst)
//遍历并打印列表中的元素 -
{ -
System.Console.Write("{0} ", val); -
} -
System.Console.WriteLine(); - }
- static
void UseSort() - {
-
int[] = {9, 8, -11, 10, -3, 2}; //准备
数据,添加到列表中 -
MyIntComparer = newMyIntComparer(); -
List intLst = newList <int>(); -
intLst.AddRange(ary);
//将数据添加到List -
PrintList intLst); //打印数据 -
intLst.Sort( ); //使
用默认比较器进行排序 -
PrintList intLst); //打印数据 -
intLst.Clear( ); //重新准备数据 -
intLst.AddRange(ary); -
intLst.Sort(mic); //用自定义
的比较器进行排序,即按绝对值排序 -
PrintList intLst); //打印数据 -
intLst.Clear( ); //重新准备数据 -
intLst.AddRange(ary); -
intLst.Sort(2, 3, mic); //对第2个开始的3
个元素按绝对值排序 -
PrintList intLst); //打印数据 - }
示例代码4-10的输出如下,默认排序之后元素按照从小到大排序,负数小于0和整数。按绝对排序之后,-3大于2,可见MyIntComparer起作用了。同样部分排序的时候,第0和1两个元素和最后一个元素都没有参与排序。
- 排序前:9
8 -11 10 -3 2 - 默认排序后:-11
-3 2 8 9 10 - 绝对值排序后:2
-3 8 9 10 -11 - 部分排序后:9
8 -3 10 -11 2
技巧:如果希望对元素从大到小排序,可以先用Sort()方法对元素从小到大排序,然后再用Reverse()将列表中的元素倒置,就变成从大到小排序