排序与list.sort()使用

诸如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中准备排序的开始元素索引和结束元素索


//_______________________________________________________以上是List.sort使用

发生问题在,在客户端和服务器执行了相同的代码功能,执行list.sort(),排序的结果却不同。

表现:发现原因在加速结束一个时间进度条的时候,结果的进度条是不是最短的那条。在点击升级新的技能的过程

Debug:在每一步点击,查看客户端执行后的排序结果和服务端执行后的排序结果。有一定可能性排序结果不同。

解决方法:因为排序原因的目的是找出时间最短的那条数据,参与排序的数据数量最多有5条;只要最简单的比较交换就行。for方法


总结:确认需求的目标是找出时间最短的那条数据,排序只是方法。排序方法的选择有多个选择,根据需求选择效果最高的。


  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值