簡體   English   中英

.Net中的字符串比較:“+”vs“ - ”

[英]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 

這兩個值是相等的,因為正在考慮腹膜殼

固定:

用序數比較代替不變量比較。這意味着決策基於簡單的字節比較,並忽略由文化參數化的套管或等價表。

參考: 使用序數StringComparison

string.Compare(“+”,“ - ”,StringComparison.Ordinal); //失敗

您可能希望使用真正的減號,Unicode代碼點\\ u2212。 您在編程中使用的減號(\\ u002d)是“連字符 - 減號”,其歸類順序是上下文敏感的,因為它也經常用作連字符。 還有更多比你想知道在許多不同類型的破折號這篇文章

使用CompareOrdinal 例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM