我一直以为.NET根据当前文化对字符串进行词典排序。但是当其中一个字符串以'-'结尾时,会发生一些奇怪的事情:
"+".CompareTo("-")
Returns: 1
"+1".CompareTo("-1")
Returns: -1
我试过所有的文化,包括不变的文化,但我还是无法得到一致的字符顺序。有人能解释一下发生了什么,以及如何在当前语言环境下获得一致的逐字符排序吗?
尝试将此更改为
string.Compare("+", "-", StringComparison.Ordinal); // == -2
string.Compare("+1", "-1", StringComparison.Ordinal); // == -2
对于任何特定的区域设置,不一定存在连续的逐字排序。
来自MSDN文档:
例如,某种文化可能指定将某些字符组合视为单个字符,或者以特定方式比较大写和小写字符,或者一个字符的排序顺序取决于在其之前或之后的字符。
确保连续的逐字排序的唯一方法是使用序数比较,如Anton's answer中所示。
string.Compare("+", "-");
string.Compare("+", "-", StringComparison.CurrentCulture);
string.Compare("+", "-", StringComparison.InvariantCulture);
string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase);
// All Pass
这两个值相等是因为考虑了语言大小写的情况。
修复方法:
将不变比较替换为顺序比较。这意味着决策基于简单的字节比较,忽略大小写或由文化参数化的等效表。
参考资料:使用顺序比较
string.Compare("+", "-", StringComparison.Ordinal); // 失败
在IT技术中,你可能需要使用真正的减号,Unicode代码点为\u2212。 编程中使用的减号(\u002d)是“连字符”,其排序顺序是上下文敏感的,因为它经常用作连字符。 有关各种破折号的更多信息,请参见此文章。
"x+".CompareTo("x-")
和"x+1".CompareTo("x-1")
,结果相同。 - H H