的高级示例教程 网络收集排序
前言
本文主要介绍另一款关于。Net集合排序,通过样例代码详细介绍,方便有需要的朋友参考学习。下面的话就不多说了,我们来看看详细的介绍。
背景:
学生有名字,学生编号,
类有类名和类序列号
学校有校名和学号(序号)
需求
现在我们需要对学生进行分类
第一个排序逻辑
先按学校编号(序号),再按班级编号,再按学生证排列。当然,当我们输入数据库信息时,有些人可能会偷懒。如果不输入学校序号、班级序号、学生证怎么办?那就B计划!
第二排序逻辑
先按学校名,再按班级名,再按学生名排列。我整理了学校、班级、学生的实体关系码如下:
命名空间排序{公开课School { public int?订购{ get设置;}公共字符串名称{ get设置;} }公共类Class { public int?订购{ get设置;}公共字符串名称{ get设置;}公立学校学校{ get设置;} }公开课学生{ public int?订购{ get设置;}公共字符串名称{ get设置;}公共类类{ get设置;}}}之前写的简单排序也可以通过OrderBy解决,如果一篇之前写的文章:
《.Net中集合排序还可以这么玩》
但是这里的排序比较复杂,简单的OrderBy恐怕解决不了。
分类
英寸Net中,列表集有一个排序单词方法。让我们选择排序方法F12,看看排序方法是什么样子的。
您可以看到Sort方法中有四个重载。让我们选择最基本的一个,这个带有Sort() 0参数。如果你明白这一点,你也应该明白其他的。让我们看看这个方法的描述:
虽然我的英语不是很好,但我还是能听懂这个基础英语,大致意思是:
列表按默认比较器排序。
那么,这个比较器是什么?
IComparable接口
其实是IComparable接口下的一个方法,也就是说,只有IComparable接口下调用比较器的方法才能按排序排序,我们F12进入I comparable看到这个界面:
如你所见,接口只有一个CompareTo方法,用我蹩脚的英语大致可以理解这句话的意思:
定义一种比较方法来对配方类型进行排序。
方法返回类型是Int类型。通过搜索相关信息,我们知道它的返回值及其含义如下:
价值
意义
复数
此实例小于传入的其他实例。
0
此实例等于传入的其他实例。
正数
此实例大于传入的其他实例。
知道了这个原理,我们就可以为学生班继承和实现这个方法。
对于文章开头的排序要求,我们再来看一下:
第一种排序逻辑(Int?)
先按学校编号(序号),再按班级序号,再按学号排列。当序列号为空时,使用第二个排序逻辑。
第二排序逻辑(字符串)
先按学校名,再按班级名,再按学生名排列,无非是对学生所涉及的Int的分析。和字符串进行比较。
Int?类型(可为空)和字符串实现了比较方法,其中可为空的如下:
但是为了更深入地理解这个方法的用法,我会自己写一个Int。类型数据比较的方法如下:
private int CompareInit(int?x,int?y) { if (x==null y==null) //如果都是空那么返回0相等返回0;if (x.HasValue y==null) //如果传入X有值,但是Y是空的,那么X比Y小返回-1。返回-1;if (x==null y.HasValue) //如果传入X为空,但是Y有值,那么X比Y大返回1。返回1;如果(十值y值)返回1;如果(十值y值)返回-1;返回0;//否则两个数相等}其中,为什么我认为有值的比空的还小返回-1呢?因为我想把空的往后排,把有值的往前排,其他流行的做法是认为有值的是比空大的,即返回1,大家可以结合自己的业务需求选择。
写好了Int?类型数据比较的方法,还有线类型数据的比较,我就不自己造轮子去写了,用现成的字符串CompareOrdinal()方法。
然后,我们开始给学生实现ICompare接口的比较方法,如下:
公共课学生: IComparableStudent { public int?订购{获取设置;}公共字符串名称{获取设置;}公共类类{获取设置;} public int与(学生其他){ if(referenceqals(this,other))返回0;//如果两个值的引用相同,那么直接返回相等if(referenceqals(null,other))返回1;//如果该实例是空的,但是传入的实例不是空的,那么返回1 //比较学校的序号var compareResult=CompareInit(这。班级,学校,秩序,其他。班级。学校。秩序);if (compareResult!=0)返回compareResult//比较班级的序号比较结果=比较信息(这。班级。秩序,其他。类。顺序);if (compareResult!=0)返回compareResult//比较学生的学号比较结果=比较信息(这。秩序,其他。订单);if (compareResult!=0)返回compareResult//如果以上还未区分出大小,比较学校的名称比较结果=字符串CompareOrdinal(这个。班级,学校,名字,其他。班级。学校。姓名);if (compareResult!=0)返回compareResult//比较班级的名称比较结果=字符串CompareOrdinal(这个。类。名称,其他。类。名称);if (compareResult!=0)返回compareResult//比较学生的名称返回字符串CompareOrdinal(这个。名字,其他。名称);}实现该方法后,就可以对列表学生使用分类方法了,我们来试试看。
使用系统;使用系统。集合。通用;命名空间sort { class Program { static void Main(string[]args){ var students=InitData();学生sort();//此处执行了分类方法控制台。写线('名称-顺序');foreach(学生中的定义变量学生){控制台.WriteLine($ '学校: {学生。班级。学校。姓名}-{学生。班级。学校。秩序}班级: {学生。班级。姓名}-{学生。类别。顺序}学生: {学生。姓名}-{学生订单});}控制台ReadLine();}静态列表学生InitData() //创建数据{ var School 1=new School(){ Order=1,Name='A ',};var school2=新学校{名称='B ',顺序=0 };var class1=新类{订单=1,名称='1 ',学校=学校1,};var class2=新类{ Order=2,Name='2 ',School=school1,};var class3=新类{ Order=1,Name='1 ',School=school2,};var student1=新学生{ Order=1,Name='1 ',Class=class1,};var student2=新学生{ Order=2,Name='2 ',Class=class1,};var student3=新学生{ Order=3,Name='3 ',Class=class1,};var student4=新学生{ Order=1,Name='1 ',Class=class2,};var student5=新学生{ Order=1,Name='1 ',Class=class3,};返回新列表学生{学生5,学生3,学生4,学生2,学生1 };} }}执行效果如下:
可以看到,学校B虽然是以B开头,但是因为期命令为0比一更靠前,所以以命令为准,学校B排到了最前面。
我已经好几天没写了。对我和我自己来说,写博客的意义在于加深印象,把我掌握的东西分享给大家。这个方法是今天同事教的。可能是园中大神的一个基础,但相信如果掌握了这个方法,对以后复杂的排序会更有用,希望对大家有帮助。
项目的GitHub地址:
https://github。com/lizhenyulife/sort(本地下载)
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
版权声明:的高级示例教程 网络收集排序是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。