C# sort 方法详解及示例

来源:互联网 发布:开淘宝上卖花卉好赚吗 编辑:程序博客网 时间:2024/04/29 16:18


诸如List<T>等泛型集合类,直接提供了sort()方法用于将集合中的元素进行排序。

但是,其前提是集合中存放的是可直接排序的基本类型,如List<int>, List<double>,如果

我们定义了一个自定义类型 Class MyClass,并创建一个自定义类型的集合如List<MyClass>,

那么无参的sort()方法就不可用了,因为不知道如何排序了。这时就需要借助:

IComparer 和 IComparable

首先,我们来看一下c#泛型List提供的Sort方法:

泛型List类的Sort方法有四种形式,分别是

1,不带有任何参数的Sort方法----Sort();

2,带有比较器参数的Sort方法 ----Sort(IComparer<T>)

3,带有比较代理方法参数的Sort方法----Sort(Comparison<(Of <(T>)>))

4,带有比较器参数,可以指定排序范围的Sort方法----Sort(Int32, Int32 IComparer(T))

【解析:】第一种方法

使用这种方法不是对List中的任何元素对象都可以进行排序,List中的元素对象必须继承IComparable接口,并且要实现IComparable接口中的CompareTo()方法,在CompareTo()方法中要自己实现对象的比较规则。

例如,Int32和Double都是实现了IComparable接口并重载了CompareTo方法的结构。(注:int和double都是Int32和Double的别名(alias))

【解析:】第二种方法

2,带有比较器参数的Sort方法 ----Sort(IComparer<T>),

1)创建一个额外的比较器类:其实就相当于将排序功能中的比较操作,留个使用者来完成。这个比较操作必须在实现了IComparer接口的自定义比较类中完成;如:

class myComparer:IComparer<MyClass>

2)制定比较规则实现比较方法:因为接口中有一个用于比较的重载函数Compare,所在在比较器类中我们必须实现它,完成自己希望的比较。所谓自己希望的比较就是说自己实现自定义对象的比较规则,例如你知道自定义类MyClass中哪个属性适合用来排序,那么就选择这个属性作为整个自定义类对象的排序属性,如该类中有年龄,学号,入学日期等属性,你可以选择年龄属性作为排序属性。如:

public class myComparer:IComparer<MyClass>

{

//实现按年龄升序排列

public int Compare(MyClass x, MyClass y)

{

return (x.age.CompareTo(y.age)); //age代表年龄属性是整型,即其已支持CompareTo方法

}

}

3)使用比较器的排序方法调用:然后,在自定义类型的集合如List<MyClass> myList,上就可以进行sort排序了,如

myList.Sort(new myComparer());

【解析:】第三种方法

3,带有比较代理方法参数的Sort方法----Sort(Comparison<(Of <(T>)>))

Comparison<(Of <(T>)>是一种泛型委托。所以,需要编写一个对象排序比较的方法,对List中的元素对象没有特殊的要求,但在比

较方法中需要实现对象比较规则,这个方法实现后,就可以把这方名字作为参数委托给List的Sort方法,Sort方法在排序时会执行这个方法对List中的对象进行比较需要编写一个对象排序比较的方法,对List中的元素对象没有特殊的要求,但在比较方法中需要实现对象比较规则,这个方法实现后,就可以把这方名字作为参数委托给List的Sort方法,Sort方法在排序时会执行这个方法对List中的对象进行比较

【解析:】第四种方法

4,带有比较器参数,可以指定排序范围的Sort方法----Sort(Int32, Int32 IComparer(T))

对于第四排序方法,实际是第二种比较器排序的一个扩展,在指定排序比较器的同时,指定排序范围,即List中准备排序的开始元素索引和结束元素索引



==========

排序示例 来源: http://www.cnblogs.com/hont/p/4375635.html

很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序。

其实理解了并不难

sort有三种结果 1,-1,0分别是大,小,相等

升序降序比较

默认List的排序是升序排序

如果要降序排序,也很简单,只需要在前面加一个负号

List<int> tmp = new List<int>(){5,1,22,11,4};tmp.Sort((x, y) => -x.CompareTo(y));Console.WriteLine(tmp);//22,11,5,4,1

对于非数值类型比较用.CompareTo(...),基于IComparable接口。基本上C#的值类型都有实现这个接口,包括string。

而数值类型也可以自己比较。排序时左右两个变量必须是左-比较-右,切记不可反过来比较。

sort方法官方推荐的 命名方式是x(左),y(右) 。对于复杂的比较 可以分出来,单独写成函数

多权重比较

假设需要tuple里item2的值优先于item1。这个时候只要给比较结果*2即可。

List<Tuple<int, int>> tmp = new List<Tuple<int, int>>(){new Tuple<int,int>(2,1),new Tuple<int,int>(53,1),new Tuple<int,int>(12,1),new Tuple<int,int>(22,3),new Tuple<int,int>(1,2),};tmp.Sort((x, y) => -(x.Item1.CompareTo(y.Item1) + x.Item2.CompareTo(y.Item2) * 2));Console.WriteLine(tmp);//22,3//1,2//53,1//12,1//2,1

如果单独对升序降序控制,可以去掉大括号,分开进行配置


0 0
原创粉丝点击