宝哥软件园

集合排序 网可以这样玩 你知道吗

编辑:宝哥软件园 来源:互联网 时间:2021-08-31

C#集合类型概述

收藏是。NET FCL(框架类库)。所有集合类都从IEnumerable继承。集合可以分为以下几类:关联/非关联集合、顺序/随机访问集合、顺序/无序集合、泛型/非泛型集合和线程安全集合。

每个集合类的底层接口图

背景:

公共类StockQuantity {公共StockQuantity(字符串状态,DateTime,int quantity){ Status=Status;DateTime=dateTime数量=数量;}公共字符串状态{ get设置;}公共DateTime { get设置;} public int Quantity { get设置;}}这个对象主要有三个字段。当前的业务需求是获取一组列表库存数量,需要排序三次。排序规则和优先级如下:

1.如果状态是空的,它会在后面,如果不是空的,它会在前面。它不关心状态的内容,只关心状态是否为空。

2.日期时间按升序排序。

3.数量按升序排序。

小白的做法是:

我只知道集合可以按OderBy排序,还有以上三个规则,所以设计思路如下。

1.库存数量。订单方(单位=单位状态)

错误,

这个排序规则不仅会考虑Status是否为空,还会考虑Status的内容。

如果状态为[“b”、“c”、空值、“d”,则排序结果为[空值”、“b”、“c”、“d]。

而我们想要的结果是[“b”、“c”、“d”、null](直接把null扔到最后,别的什么都不会动)

怎么办?

我还不知道,让我们别管它

2.按升序对日期时间进行排序,这很简单

库存数量。OrderBy(u=u.DateTime)

对了一半!

为什么说对了一半?看下面

3.在订购2的前提下,使用OrderBy,即库存数量。排序依据(u=u.datetime)。订购方(u=u .数量)

错误!

上面的表达式相当于下面两个表达式:

库存量=库存数量。订货人(u=u. datetime)库存数量=库存数量。order by (u=u. Quantity),所以第一个代码是废品代码,最终的排序还是以数量为基础。

虽然我是小白,但我还是明白这是不对的,所以我做的是

库存数量=库存数量。OrderBy(u=u.DateTime)。to list();foreach(库存数量中的var date order){ var date timeorderby=库存数量。其中(u=u.DateTime.Date==dateOrder。日期时间。order by(u=u . Count);foreach(datetime order by中的var count order){ if(count order。OutPut==false) { Console。WriteLine($'{countOrder。状态}-{countOrder。DateTime}-{countOrder。count } ');countOrder。OutPut=true} } }控制台。ReadKey();采用双层循环,先得到按时间排序的数据dateOrder,然后对与数据同一天的所有数据进行排序,对Quantity进行排序。为了防止重复输出,我还向StockQuantity对象添加了Output属性。当属性为false时,输出对象的内容,输出属性设置为true,这样输出就不会重复,先对DateTime排序,再对Quantity排序。太简单了!

然而,当我高高兴兴地提交这样的代码时,却被同事们狠狠地鄙视了一顿,说:“真是糟糕的代码!”但是还有比这更好的代码吗?

我给同事们倒了一杯茶,点上一支烟,虚心求教。

老大哥的做法:

同事给我讲了两个诀窍,即条件排序和多级排序。

什么是条件排序,如何使用?

1.库存数量。订单方(u=u .状态==空)

这是条件排序,但乍一看,给人的错觉是前排的Status是空的,后排不是空的。

其实不然,我们在OrderBy中看到一个返回值是bool类型的表达式。在这种排序中,结果首先是0(假),然后是1(真)。这种排序只考虑返回的bool值,不考虑参数的具体值,所以我们称之为条件排序。

完全符合整理1的要求。

什么是多级排序,如何使用?

2.利用我上面我的代码排序虽然可以实现先排日期时间,再排数量,但是该算法的时间复杂度的n*n,而且给库存数量添加了输出字段,明显是不科学的。

然而,连续地使用多个排序最终只会生效最后一个订单方,天无绝人之路,所以这个时候应该使用然后呢!使用然后可以讲以上的三条排序规则简化如下:

库存数量=库存数量订单方(u=u .状态==空).然后是(u=u.DateTime).然后是(u=u。数量)。to list();

即可完美地实现再前一个排序前提下进行二级排序。

优化后的完整代码如下:

使用系统;使用系统。集合。通用;使用系统Linq .命名空间按{ class Program {排序{ static void Main(string[]args){ var stock quantures=new liststockquantum(){ new stock quantum('正常品,新的日期时间(2017,4,16),12),新的库存数量('正常品,新的日期时间(2017,4,17),15),新的库存数量('残次品,新的日期时间(2017,4,16),10),新的库存数量('残次品,新的DateTime(2017,4,17),8),新的库存数量(空,新的DateTime(2017,4,18),8),};库存数量=库存数量订单方(u=u .状态==空).然后是(u=u.DateTime).然后是(u=u。数量)。to list();foreach(库存数量中的变量库存数量){控制台.WriteLine($'{stockQuantity .状态}-{库存数量。日期时间}-{库存数量。数量} ');}控制台ReadKey();} }公共类库存数量公共库存数量(字符串状态,日期时间,整数){状态=状态;日期时间=日期时间数量=数量;}公共字符串状态{获取设置;}公共DateTime { get设置;}公共整数数量{ get设置;} }}简单的一个排序优化,就把程序的时间复杂度从N*N降低到了n,所以在这里把这两种排序技巧分享出来,希望对不会的同学有所帮助。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

更多资讯
游戏推荐
更多+