[英]String comparison in .Net: “+” vs “-”
根據當前的文化,我總是假設.Net按字典順序比較字符串。 但是當其中一個字符串以' - '結尾時,有一些奇怪的事情:
"+".CompareTo("-")
Returns: 1
"+1".CompareTo("-1")
Returns: -1
我得到了我嘗試的所有文化,包括不變的文化。 任何人都可以解釋發生了什么,以及如何獲得當前區域設置的一致字符排序?
嘗試將此更改為
string.Compare("+", "-", StringComparison.Ordinal); // == -2
string.Compare("+1", "-1", StringComparison.Ordinal); // == -2
對於任何特定的語言環境,不一定有一致的逐字符排序。
從MSDN文檔 :
例如,文化可以指定某些字符組合被視為單個字符,或者以特定方式比較大寫和小寫字符,或者字符的排序順序取決於其前面或后面的字符。
確保一致的逐字符排序的唯一方法是使用序數比較,如Anton的答案所示 。
string.Compare("+", "-"); string.Compare("+", "-", StringComparison.CurrentCulture); string.Compare("+", "-", StringComparison.InvariantCulture); string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase); // All Pass
這兩個值是相等的,因為正在考慮腹膜殼
固定:
用序數比較代替不變量比較。這意味着決策基於簡單的字節比較,並忽略由文化參數化的套管或等價表。
string.Compare(“+”,“ - ”,StringComparison.Ordinal); //失敗
您可能希望使用真正的減號,Unicode代碼點\\ u2212。 您在編程中使用的減號(\\ u002d)是“連字符 - 減號”,其歸類順序是上下文敏感的,因為它也經常用作連字符。 還有更多比你想知道在許多不同類型的破折號這篇文章 。
使用CompareOrdinal 。 例如
String.CompareOrdinal("+1","-1");
-2
String.CompareOrdinal("+","-");
-2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.