连字符后的字符会影响字符串比较结果

6
我希望“2-”和“22”始终以相同的方式进行比较,但更改第三个字符会更改排序顺序。
string.Compare("2-1","22-", StringComparison.CurrentCulture) //-1
string.Compare("2-2","22-", StringComparison.CurrentCulture) //1

这里到底发生了什么?

顺便提一下,我们的文化设置是en-US。


我会期望"2-"和"22"始终以相同的方式进行比较,为什么呢?它们从未相同过,对吗? - Rahul
我本以为2应该小于22,难道不应该两个都是-1吗? - Billy Jake O'Connor
1
类似的问题可以在这里找到:https://dev59.com/XXvaa4cB1Zd3GeqPJexK。 - Phylogenesis
1个回答

10
根据文档说明:
引用如下:

字符集包括可忽略的字符。在执行基于区域性比较的比较时,Compare(String, String, StringComparison)方法不会考虑这样的字符。若要在比较中识别可忽略的字符,请为comparisonType参数提供StringComparison.OrdinalOrdinalIgnoreCase的值。

在您的情况下,连字符是一种可忽略的字符。在此情况下,这意味着中间的连字符将被忽略。这意味着实际上对212222-进行比较,结果分别为-11


哈哈,我也这么想。我们需要当前的文化,并且需要它不忽略这些字符。有没有其他替代方法而不使用 Ordinal?谢谢。 - Billy Jake O'Connor
语言匹配非常困难(就像你现在拥有的)。Ordinal是另一端。我不指望中间会有任何东西,除非你自己编写它。 - Patrick Hofman
1
谢谢。对于想要编写自己的程序的人,你可以在这个文档中找到 Default_Ignorable_Code_Point 中被忽略的字符:http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt - Billy Jake O'Connor
你肯定不是指 21-,因为这在问题的任何比较中都没有出现。 - David Conrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接