当前位置: 代码网 > it编程>编程语言>Asp.net > C# List.Sort四种重载总结

C# List.Sort四种重载总结

2025年12月01日 Asp.net 我要评论
在实现工作中的系统功能时,总是会出现对数据排序的需求,而排序算法在c#中有提前封装好的方法,即list.sort1. sort方法的四种重载在list中可以看到,分别为list<t>.so

在实现工作中的系统功能时,总是会出现对数据排序的需求,而排序算法在c#中有提前封装好的方法,即list.sort

1. sort方法的四种重载

在list中

可以看到,分别为

list<t>.sort();   
list<t>.sort(icomparer<t> comparer);
list<t>.sort(int index, int count, icomparer<t> comparer);
list<t>.sort(comparison<t> comparison);

其中,第一,第二两个方法内部其实都是在调用第三个方法,只不过参数传的不一样。

第三个方法的index参数表示从哪个索引开始,count表示要排序的个数,comparer表示实现了icomparer接口的类型,用于实现排序规则,可以看到前两个方法都是从头开始全量排序。
最终调用的都是array.sort()方法

2. 具体使用

- list.sort();

可以看到对于int类型默认是实现升序排序的,对于bool类型,false会排在true前面

那如果是一个复杂类型呢?

可以看到,传的是一个demo类型的对象,但是直接使用sort方法会报错,提示“未能比较数组中的两个元素,必须至少有一个对象实现icomparable”

那么为什么会报这个错呢,深入源码来看,从调用堆栈看应该是走到了这一步,在array中

继续深入,来到arraysorthelper类

注意此时的comparer因为是null,所以给了一个comparer.default

最终来到了

然后在调用comparer.compare方法时报错

深入comparer类,查看default

即最终调用的是objectcomparer.compare方法

进行最终深入,来到comparer类的compare方法

首先会判断m_compareinfo是否为空,那么看上面

可以看到,虽然default会传入一个compareinfo,但是因为传入的对象类型在强制类型转换为string后其实是null,所以会进行下面的判断。

即比较的最终执行是判断比较的两个对象是否实现了icomparable接口,而传入的demo类型并没有实现这个接口,所以最终报错

- icomparable 接口

按照上面探索的结果,直接使用sort方法最终会判断传入类型是否实现了icomparable 接口,那么int类型和bool类型能够直接使用说明两者实现了icomparable 接口

先看int类型

可以看到int实现了icomparable 的compareto方法,规则为小于返回-1,大于返回1,等于返回0,说明此时返回-1是升序,返回1是降序

再看bool类型

规则为等于返回0,如果自身为false返回-1,如果自身为true,返回1

再回到

可以看到,当comparer.compare返回大于0时,会将比较的双方进行交换,所以int类型和bool类型的最终结果显而易见,即大的数和true会被交换到后面

对于string类型,其也实现了icomparable 接口,但字符串的比较是通过比较每一个字符的unicode 编码大小,这里不再赘述

- 复杂类型的比较

综上所述,如果需要比较一个复杂的类型,那么必须实现icomparable 接口

比如这里的demo类型,实现了自定义的比较方法,先比较name,再比较age

或者,使用list.sort(icomparer comparer),即需要实现icomparer接口,定义一个比较器

democomparer实现了icomparer接口,在内部实现了自定义的demo类型的比较

- list.sort(comparison comparison)

或者

可以看到这里会使用array的方法,将comparison转换为icomparer的比较器

最终调用的就是传入的comparison委托

到此这篇关于c# list.sort四种重载总结的文章就介绍到这了,更多相关c# list.sort重载内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com