C# ASCII比较和字符串比较之间的区别
我用的是C#。当我比较两个字符值时,它会向我发送正确的输出,比如C# ASCII比较和字符串比较之间的区别,c#,string-comparison,C#,String Comparison,我用的是C#。当我比较两个字符值时,它会向我发送正确的输出,比如 '-'.CompareTo('!') //Its sending me positive value 12 表示'-'>'!'是真的 但当我比较两个相同值的字符串时,它会给我不同的结果 "-".CompareTo("!") //Its sending me negative value -1 表示“-”>“!”为假 有谁能解释一下它为什么这样做?这两种情况是否都应为“真”此比较“-”。CompareTo(“!”)将执行顺序比较
'-'.CompareTo('!') //Its sending me positive value 12
表示'-'>'!'是真的
但当我比较两个相同值的字符串时,它会给我不同的结果
"-".CompareTo("!") //Its sending me negative value -1
表示“-”>“!”为假
有谁能解释一下它为什么这样做?这两种情况是否都应为“真”此比较
“-”。CompareTo(“!”)
将执行顺序比较。它将比较数字UTF-16编码值(45
和33
)
字符串比较“-”。CompareTo(!”
不同,它将执行一个区域性感知比较。这意味着,无论数值是多少,字符都将根据当前区域性的排序规则进行排序
您可以尝试对字符串使用顺序比较:
String.CompareOrdinal("-", "!")
这将对字符串执行顺序比较,然后得到相同的结果(12
)
您无法对字符
(如果需要,只需将其转换为字符串
)执行(真正的)区域性感知比较,因为排序顺序可能会受到比较前后字符的影响,单个字符可能不是一个图形(并且排序可能不适用)。举个例子:在捷克语中,C排在H之前,然后你期望H。CompareTo(“H”)=-1…错了,“ch”是一个有向图,它在H和I之间,然后“ch”。CompareTo(“H”)==1
!!!更多关于这个的
顺序比较之所以不同,仅仅是因为它继承了ASCII(我尝试过的每个文化都返回相同的排序结果)。它们保留了ASCII顺序以实现兼容性(并更容易迁移到Unicode),但对于字符串比较,它们必须遵守区域性规则
更常见的例子是大写/小写字符(注意“和”以执行顺序和区域性比较):
如果您这样做是为了执行文本搜索,那么我强烈建议您不要直接使用
Char
comparison,除非您知道区域性问题(排序)和Unicode详细信息(代理项和编码,主要)
var v = '-'.CompareTo('!');//12
var s = string.CompareOrdinal("-", "!");//12
这是由于
Char
和String
类中的IComparable
方法CompareTo
的实现不同造成的
Char.cs
String.cs
其中,逻辑是依赖于内部
内部比较的区域性感知比较。比较用于排序,而非(必要)检查相等。实例被视为“相等”“如果CompareTo
返回零。有关更多信息,请参阅和。发件人:此方法执行的比较基于此实例和值的编码值,而不是它们的字典特征。@Corak-我正在实现字符串的二进制搜索方法。所以我需要一个排序数组。那么,您认为我应该使用CompareTo()或我自己的比较方法吗?@Arnab在进行自定义字符串比较时要小心,除非您真正了解不同区域性之间的差异(或者您使用的是单个区域性)。角色比较(如你所见)很容易误导人。。。在任何情况下,在比较字符串时,您可能不需要char
逻辑。问题是您希望如何对它们进行排序。它应该是文化意识的,还是文化独立的,还是词典独立的?String.CompareTo
或String.CompareToOrdinal
是否按您想要的排序?然后使用这些,否则建立自己的排序逻辑您可能还想看看,我正在实现一个字符串的二进制搜索方法。所以我需要一个排序数组。那么您认为使用CompareTo()会有什么问题吗?或者我应该使用CompareOrdinal吗?这取决于您的结果需要如何,如果您需要依赖于区域性的比较,请使用CompareTo
,还有其他可比较的选项,它们是InvariantCulture
,并忽略它们的大小写变体。请参考我提供的链接,选择最合适的。
var v = '-'.CompareTo('!');//12
var s = string.CompareOrdinal("-", "!");//12
public int CompareTo(Char value) {
return (m_value-value);
}
public int CompareTo(String strB) {
return CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, 0);
}