C# 第二个字符串较长时的奇怪字符串排序

C# 第二个字符串较长时的奇怪字符串排序,c#,string,sorting,C#,String,Sorting,比较“î” 用“我” 当前的文化是en-GB。我希望所有这些都能返回1。为什么较长的字符串会改变排序顺序?来自 当发现一个不等式或比较了两个字符串时,比较终止但是,如果两个字符串的比较等于一个字符串的结尾,而另一个字符串有剩余字符,则认为剩余字符的字符串更大。返回值是上次执行比较的结果 基本上是因为排序字符串时长度很重要 “a”比“a”小,对吗?有道理。这种行为很奇怪,我会告诉你的,但鉴于这里暗示的国际背景,我不明白为什么不使用顺序比较 有关更多信息,请阅读。有关详细信息,请参阅 特别是,请参见

比较“î”

用“我”

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

来自

当发现一个不等式或比较了两个字符串时,比较终止但是,如果两个字符串的比较等于一个字符串的结尾,而另一个字符串有剩余字符,则认为剩余字符的字符串更大。返回值是上次执行比较的结果


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


“a”比“a”小,对吗?有道理。

这种行为很奇怪,我会告诉你的,但鉴于这里暗示的国际背景,我不明白为什么不使用
顺序比较

有关更多信息,请阅读。

有关详细信息,请参阅

特别是,请参见第1.1节“多级比较”,其中解释了这种行为

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

role

这与您的示例中的“I”、“î”和“I”类似,即:

“I”<“I”

除了
角色
末尾有一个
s
之外,您的示例末尾有一个空格。但同样的逻辑也适用;额外的字符是什么并不重要——一个简单的事实是,有一个额外的字符使它在“î”之后排序

规范中的一个关键点是:

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

如果长度不同,则基础字母也会不同,因此在示例中,重音差异会被忽略,并在末尾留有空格


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

事实上-当我使用“I”而不是“î”时,我得到以下结果:string.Compare(“I”,“I”,StringComparison.currentcurity)返回-1字符串。Compare(“I”,“I”,StringComparison.currentcurity)-1使用此信息更新您的问题。您尝试过其他区域性吗?我刚刚尝试了.NET中的所有区域性,它们中的每一个都返回
“î”
vs.
“I”
as+1和
“î”
vs.
“I”
as-1.我建议您通过添加空格来改变排序顺序的两个字符串来澄清问题,您所问的问题的答案似乎有点混乱。string.Compare(“î”,“I”,StringComparison.CurrentCulture)--返回1个string.Compare(“î”,“I”,StringComparison.CurrentCulture)--返回-1那么-为什么î和我被认为是相等的?î有一些特别的地方-我不明白为什么如果它被认为等于'I'它就不返回0,或者如果它不等于'I',当长度较长时改变它的答案…î有一些特别的地方-我不明白如果它被认为等于'I'它为什么不返回0,或者,如果长度不相等,请在长度较长时更改其答案…为什么“î”与“I”+1相比,而“î”与“I”-1相比?您重复了完全相同的内容,这是什么意思?字符串用于在视图中为某些音乐元数据提供排序顺序。我希望结果是文化敏感的。我想我可以把它改为顺序比较……对于文化敏感的文本显示,顺序比较和排序几乎总是错误的选择。这个答案和那个页面就是为什么在处理文化敏感列表时,没有人应该编写自己的文本排序/比较实现。诚然,在.NET实现中可能会有bug,但我保证如果我自己写的话,我会有bug。好答案,好问题!
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)
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