当前位置: 首页 > 编程语言 > C#

如何使用C#对数字子串上的字符串列表进行排序

时间:2023-04-10 11:34:53 C#

C#中如何对数字子串上的字符串列表进行排序根据该子字符串的数值重新排序。该集合看起来像这样,但更大:Liststrings=newList{"some-name-(1).jpg","some-name-(5).jpg","some-name-(5.1).jpg","some-name-(6).jpg","some-name-(12).jpg"};数字总是会被括在括号中,这是字符串中唯一的括号,所以使用String.IndexOf是可靠的。请注意,不仅可能缺少数字,还可能缺少小数,而不仅仅是整数。我无法获得按该子字符串的数值排序的那些相同字符串的重新排序列表。有没有人有办法做到这一点,希望是一种行为良好的方法?谢谢。这将检查括号之间的项目是否可转换为双精度数,否则返回-1。varnumbers=strings.Select(x=>x.Substring(x.IndexOf("(")+1,x.IndexOf(")")-x.IndexOf("(")-1)).Select(x=>{doubleval;if(double.TryParse(x,outval)){returnval;}//或者你想做的任何事情return-1;}).OrderBy(x=>x);//或者使用如果您确定括号之间总是有数字,请使用OrderByDescending,因为它更短:varnumbers=strings.Select(x=>x.Substring(x.IndexOf("(")+1,x.IndexOf(")")-x.IndexOf("(")-1)).Select(x=>double.Parse(x)).OrderBy(x=>x);//或者使用OrderByDescendingEDIT我需要原件charstring,只需按这些数字排序。基本上你需要做的是将谓词传递给OrderBy并告诉它按数字排序:varitems=strings.OrderBy(x=>double.Parse(x.Substring(x.IndexOf("(")+1,x.IndexOf(")")-x.IndexOf("(")-1)));那么OO方法呢?我们正在对字符串进行排序,但我们需要像对待数字一样对待它们.如果我们有一种方法可以调用OrderBy并为我们订购它,那不是很好吗?嗯,有。OrderBy方法将使用IComparable(如果可用)。让我们创建一个类来保存我们的jpg路径并实现IComparable接口。publicclassCustomJpg:IComparable{publicCustomJpg(stringpath){this.Path=path;}公共字符串路径{得到;私有集;}私有双数=-1;//如果需要,您甚至可以将其公开。privatedoubleNumber{get{//让我们缓存该号码以供后续调用if(this.number==-1){intmyStart=this.Path.IndexOf("(")+1;intmyEnd=this.Path.IndexOf(")");stringmyNumber=this.Path.Substring(myStart,myEnd-myStart);双我的价值;if(double.TryParse(myNumber,outmyVal)){this.number=myVal;}else{thrownewArgumentException(string.Format("{0}没有括号或括号之间有数字。",this.Path));}}返回this.number;}}publicintCompareTo(CustomJpgother){if(other==null){return1;}返回this.Number.CompareTo(other.Number);}}上面的方法对于OrderBy有什么用,如果我们一直调用OrderBy,它就不用每次都找开头(结尾)和做数字解析了。它在第一次调用时缓存它,然后继续使用它。另一个好处是我们可以绑定到Path属性,也可以绑定到Number(我们必须将访问修饰符从私有更改)。我们甚至可以引入一个新属性来保存缩略图并将其绑定到该图像。如您所见,这种方法更加灵活、简洁并且是面向对象的方法。另外,查找数字的代码在一个地方,所以如果我们从()切换到另一个符号,我们只需要在一个地方改变它。或者我们可以修改为先查找(),如果找不到,再查找另一个符号。这是用法:Listjpgs=newList{newCustomJpg("some-name-(1).jpg"),newCustomJpg("some-name-(5).jpg"),newCustomJpg("some-name-(5).jpg"),newCustomJpg("some-name-(5.1).jpg"),newCustomJpg("some-name-(6).jpg"),newCustomJpg("some-name-(12).jpg")};varordered=jpgs.OrderBy(x=>x).ToList();您可以对任何对象使用此方法。在上面的示例代码中,返回了一个按数字排序的数字列表,但是如果你想要一个按名称排序的文件名列表,那么最好在数字的开头添加相同的零,如“some-name-(001).jpg",你可以简单地订购Liststrings=newList{"some-name-(001).jpg","some-name-(005.1).jpg","some-name-(005).jpg","某名-(004).jpg","某名-(006).jpg","某名-(012).jpg"};varorederedByName=strings.Select(s=>s).OrderBy(s=>s);如果先切掉右括号“)”开始的部分,则可以更轻松地选择子字符串。即从"some-name-(5.1).jpg"中先得到"some-name-(5.1)",然后把"(")后面的部分去掉。这样就省去了长度计算,因为第二个Substring会自动把everything都取消了字符串的结尾。strings=strings.OrderBy(x=>Decimal.Parse(x.Substring(0,x.IndexOf(")")).Substring(x.IndexOf("(")+1))).ToList();这在这里可能不是很重要,但一般来说,存储带小数的数字比双精度数字更准确。double可以将17.2转换为17.19999999999999。以上就是C#学习教程:HowtouseC#tosortthelistofstringsonnumericsubstrings。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: