.Net中的字符串比较:“+”vs“ – ”

根据当前的文化,我总是假设.Net按字典顺序比较字符串。 但是当其中一个字符串以’ – ‘结尾时,有些奇怪:

"+".CompareTo("-") Returns: 1 "+1".CompareTo("-1") Returns: -1 

我得到了我尝试的所有文化,包括不变的文化。 任何人都可以解释发生了什么,我怎样才能获得当前语言环境的一致字符排序?

对于任何特定区域设置,不一定按字符排序。

从MSDN文档 :

例如,文化可以指定某些字符组合被视为单个字符,或者以特定方式比较大写和小写字符,或者字符的排序顺序取决于其前面或后面的字符。

确保按字符排序一致的唯一方法是使用序数比较,如Anton的答案所示 。

尝试将此更改为

 string.Compare("+", "-", StringComparison.Ordinal); // == -2 string.Compare("+1", "-1", StringComparison.Ordinal); // == -2 
  string.Compare("+", "-"); string.Compare("+", "-", StringComparison.CurrentCulture); string.Compare("+", "-", StringComparison.InvariantCulture); string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase); // All Pass 

这两个值是相等的,因为正在考虑腹膜壳

固定:

用序数比较替换不变量比较。这意味着决策基于简单的字节比较,并忽略由文化参数化的套管或等价表。

参考: 使用序数StringComparison

string.Compare(“+”,“ – ”,StringComparison.Ordinal); //失败

您可能希望使用真正的减号,Unicode代码点\ u2212。 您在编程中使用的减号(\ u002d)是“连字符 – 减号”,其归类顺序是上下文敏感的,因为它也经常用作连字符。 在本文中,您将不仅仅想了解许多不同类型的破折号。

使用CompareOrdinal 。 例如

 String.CompareOrdinal("+1","-1"); -2 String.CompareOrdinal("+","-"); -2