问题描述
是关于减号“-”和下划号“_”之间的比较。单独比较是下划线大,但是多加一个任意字符,结果就相反了。现在在搞一个排序,排到这出现了错误,竟然是他们之间的比较造成的。感觉是因为减号与后面的字符连成了一体进行了比较。大家有没有办法让图二的大小与图一保持一致呢?谢谢!!!
解决方案
解决方案二:
-_先替换掉不就行了
解决方案三:
这是因为'-'连字符的原因。根据MSDN(http://msdn.microsoft.com/zh-cn/library/system.globalization.compareoptions):引用MSDN:
某些非字母数字字符可能被指定了特殊权重;例如,可能为连字符(“-”)指定了很小的权重,这样,“coop”和“co-op”会在排序后的列表中相邻出现。
我猜测当’-‘单独出现的时候,不被认为是连字符,因此它比’_‘小。而当它作为小权重的连字符出现在'-a'中时,比较的主力为'a',而'a'比'_'大。你把下划线换成其他字符(比如空格,加号,星号等等)可以观察到同样的结果。如果你想要一致的结果,可以用序号排序(既用字符的Unicode码排序):string.Compare(a,b,StringComparison.Ordinal)
解决方案四:
Console.WriteLine(string.Compare("_","-",CultureInfo.InvariantCulture,CompareOptions.StringSort));Console.WriteLine(string.Compare("_a","-a",CultureInfo.InvariantCulture,CompareOptions.StringSort));
解决方案五:
路过,接分,没试过这种用法
解决方案六:
直接用==可以吗
解决方案七:
2楼和三楼的大神,这样比较-倒是可以了,但是像是数字就比较错了,比如2比11还大。有没有两全其美的办法呢?
解决方案八:
直接用==或eques吧不知道你要做什么,实在不行重写比较运算符吧
解决方案九:
#7是比较大小,不是等不等于
解决方案十:
引用6楼smart_soul的回复:
2楼和三楼的大神,这样比较-倒是可以了,但是像是数字就比较错了,比如2比11还大。有没有两全其美的办法呢?
没有字符串比较是从左到右依次比较,而数字比较是从右到左依次比较(其实应该先转数字型然后直接比较数值,不过这样说更形象一些)你到底是想怎么比较,不可能从两头往中间比吧
解决方案十一:
晕,犯了个巨大的错误数字比较,数字是带进位的,所以是先转数字,再比较值而字符串的每个字符之间没有必然联系,只能单纯的从左到右依次比较要不你把2改成02再和11比.
解决方案十二:
引用10楼Z65443344的回复:
晕,犯了个巨大的错误数字比较,数字是带进位的,所以是先转数字,再比较值而字符串的每个字符之间没有必然联系,只能单纯的从左到右依次比较要不你把2改成02再和11比.
我想比较的就是文件名称,可以把一个文件夹按照名称排序,其实win7系统就是按照string.compare比较的,但是项目组里面非要数字能够比较,其他字符能够一个个比较。
解决方案十三:
那你就先把文件名转一下数字试试看,如果能转,那么按照数字排序.如果不能转,那么按照字母排序
解决方案十四:
用boolb=int.tryparse(string)
解决方案十五:
严格来说,其实只要出现string.Compare,就必定要指定使用的CultureInfo,否则代码的行为是不确定的。Resharper把不指定CultureInfo的字符串比较定义为警告想必你的机器是中文系统,而汉语中连字符是无意义的,排序时不考虑,直接被忽略了。你指定英文的CultureInfo即可,不严格的话也可以把“-”替换成别的字符(比如全角)再比较,视你需求题外话,sqlserver也有类似情况里如果你orderbyxxxcollatechinese_prc_ci_as,排序时就是忽略连字符的,如果orderbyxxxcollateSQL_Latin1_General_CP1_CI_AS就不忽略
解决方案:
比较字符串和比较数字不同。