C# string.compare() 特殊字符排序出现问题

问题描述

是关于减号“-”和下划号“_”之间的比较。单独比较是下划线大,但是多加一个任意字符,结果就相反了。现在在搞一个排序,排到这出现了错误,竟然是他们之间的比较造成的。感觉是因为减号与后面的字符连成了一体进行了比较。大家有没有办法让图二的大小与图一保持一致呢?谢谢!!!

解决方案

解决方案二:
-_先替换掉不就行了
解决方案三:
这是因为'-'连字符的原因。根据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就不忽略
解决方案:
比较字符串和比较数字不同。

时间: 2024-08-01 08:42:11

C# string.compare() 特殊字符排序出现问题的相关文章

String.Compare的用法

Console.WriteLine("*******************String.CompareTo()*********************"); String strTestCompare = "abc"; //strTestCompare.CompareTo("abc")=0 //strTestCompare.CompareTo("ab")=1 //strTestCompare.CompareTo("

string compare-关于String.Compare的问题

问题描述 关于String.Compare的问题 String.Compare比较两个字符串是比较他们的ASCll码吧? 为什么小写字母h和大写字母Y做比较会返回-1.有截图在线等. 解决方案 ............... 解决方案二: String拼接问题

对象-string.compare那的字符串的比较一直出现问题,求大神赐教 拜托拜托!!!

问题描述 string.compare那的字符串的比较一直出现问题,求大神赐教 拜托拜托!!! protected void Button5_Click(object sender, EventArgs e) { string name = Request.Params["name"].ToString(); Session["xmname"] = Server.HtmlEncode(name.Trim()); SqlConnection sqlconn = new

关于如string.compare类似方法请教

问题描述 本人机械男,初学VB.Net,请各前辈不吝赐教!在我的概念中,方法是对象的方法.如:strName.Toupper我理解就是对strName对象调用Toupper方法但是对诸如:string.compare().MessageBox.Show()等我就不能理解了还有变量类型整形.浮点形对应的是system命名空间定义的结构体,声明用Dim--As--能理解但string对应的是system命名空间定义的类,声明为什么也是用Dim--As--而不是Dim--AsNew--呢 解决方案 解

Java String.split()特殊字符的使用

split在jdk中用法说明: String[] split(String regex) Splits this string around matches of the given regular expression. public String[] split(String regex) Splits this string around matches of the given regular expression. This method works as if by invoking

PropertyGrid控件 分类(Category)及属性(Property)排序

最近在做表单设计器,设计器上的控件都是我们自己封装的,但每个属性类别里的属性是按照属性的拼音排序的,现在想按照PropertyIndex标识进行排序(PropertyIndex的后三位是用来标识编辑器的). 具体实现如下: using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.ComponentModel; using HC.Test.Com

类 String详细用法小结

所有已实现的接口: Serializable, CharSequence, Comparable<String> public final class String extends Objectimplements Serializable, Comparable<String>, CharSequence String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓

用JavaScript判断日期、数字、整数和特殊字符

javascript|日期 如何在用一个程序检测所输入的内容是否合法,以下是本人自己编写的一个程序对日期.数字.整数和特殊字符进行了判断同时还可判断是正数还是负数(对数值类和整数而言) < script language="javascript"> < !-- /** LogicalValue:用于判断对象的值是否符合条件,现已提供的选择有: integer:整型,还可判断正整型和负整型 number :数值型,同样可判断正负 date :日期型,可支持以自定义分隔符

抛砖引玉——实现LISTVIEW点击COLUMN排序的代码,可实现按时间,字符,数字排序(控件部分)

using System;using System.ComponentModel;using System.Collections;using System.Diagnostics;using System.Windows.Forms;using System.Drawing; namespace ListViewControl{    /// <summary>    /// Summary description for UserControl1.    /// </summary&