比较“î”
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.为什么有一个更长的字符串会改变排序顺序?
答案 0 :(得分:9)
有关详细信息,请参阅UTS#10: Unicode Collation Algorithm。
特别是,请参阅 1.1多级比较部分,它解释了这种行为。
有一张表格显示了一些例子,例如:
role < rôle < roles
这类似于“I”,“î”和“I”的例子,即:
"I" < "î" < "I "
除了roles
末尾有s
的情况,您的示例最后会有一个空格。但同样的逻辑适用;这与额外的角色无关 - 简单的事实是是一个额外的角色使它在“î”之后排序。
规范的一个关键点是:
如果基本字母不同,通常会忽略重音差异。
如果长度不同,则基本字母会有所不同,因此在示例中忽略重音差异,并在末尾添加空格。
但是,如果字符串的长度相同,则重音差异 not 将被忽略 - 这正是您所看到的结果。
答案 1 :(得分:2)
当发现不等式或比较两个字符串时,比较终止。 但是,如果两个字符串比较等于一个字符串的结尾,而另一个字符串剩余字符,那么包含剩余字符的字符串将被视为更大。返回值是上次比较的结果进行。
答案 2 :(得分:0)
基本上因为排序字符串长度很重要
“a”小于“a”对吗?有道理。
答案 3 :(得分:-1)
行为很奇怪,我会给你这个,但我不明白为什么不使用Ordinal
比较给出这里隐含的国际背景。
有关详情,请参阅this article。