第二个字符串更长时奇怪的字符串排序

时间:2013-05-17 11:01:54

标签: c# string sorting

比较“î”

string.Compare("î", "I ", StringComparison.CurrentCulture) -- returns -1
string.Compare("î", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1
string.Compare("î", "I", StringComparison.CurrentCulture) -- returns 1 (unexpected)
string.Compare("î", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 1  (unexpected)

用“i”

string.Compare("i", "I ", StringComparison.CurrentCulture) -- returns -1
string.Compare("i", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1
string.Compare("i", "I", StringComparison.CurrentCulture) -- returns -1
string.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 0

目前的文化是en-GB。我希望所有这些都返回1.为什么有一个更长的字符串会改变排序顺序?

4 个答案:

答案 0 :(得分:9)

有关详细信息,请参阅UTS#10: Unicode Collation Algorithm

特别是,请参阅 1.1多级比较部分,它解释了这种行为。

有一张表格显示了一些例子,例如:

role < rôle < roles

这类似于“I”,“î”和“I”的例子,即:

"I" < "î" < "I "

除了roles末尾有s的情况,您的示例最后会有一个空格。但同样的逻辑适用;这与额外的角色无关 - 简单的事实是一个额外的角色使它在“î”之后排序。

规范的一个关键点是:

  

如果基本字母不同,通常会忽略重音差异。

如果长度不同,则基本字母会有所不同,因此在示例中忽略重音差异,并在末尾添加空格。

但是,如果字符串的长度相同,则重音差异 not 将被忽略 - 这正是您所看到的结果。

答案 1 :(得分:2)

来自Documentation

  

当发现不等式或比较两个字符串时,比较终止。 但是,如果两个字符串比较等于一个字符串的结尾,而另一个字符串剩余字符,那么包含剩余字符的字符串将被视为更大。返回值是上次比较的结果进行。

答案 2 :(得分:0)

基本上因为排序字符串长度很重要

“a”小于“a”对吗?有道理。

答案 3 :(得分:-1)

行为很奇怪,我会给你这个,但我不明白为什么不使用Ordinal比较给出这里隐含的国际背景。

有关详情,请参阅this article