2016-08-02 57 views
2

我弄亂用C#一點,發現產生非常不舒服的結果的代碼:C#字符串:爲什麼字符串a == b運算符給出與a.CompareTo(b)== 0不同的答案?

static void Main(string[] args) 
    { 
     string a = "string", b = "string\0"; 
     bool b1 = a == b; 
     bool b2 = (a.CompareTo(b) > 0); 
     bool b3 = (a.CompareTo(b) < 0); 
     bool b4 = (a.CompareTo(b) == 0); 
     Console.WriteLine(a); 
     Console.WriteLine(b); 
     Console.WriteLine("{0} {1} {2} {3}", b1, b2, b3, b4); 
    } 

輸出:

string 
string 
False False False True 

預期輸出(的):

string 
string 
True False False True 
+0

您可以編輯您的文章,並添加您預期的輸出? –

回答

8

CompareTo的結果並不意味着平等,它與排序順序有關。我不確定爲排序目的而忽略空字符是否太令人吃驚。

the documentation

字符集包括忽略字符。 CompareTo(String)方法在執行文化敏感比較時不會考慮這些字符。

+0

如果你正在尋找等價的方法使用a.Equals(b) – TwistedStem

+0

但它可能是安全問題或一個錯誤誰認爲'CompareTo()== 0'給與相等運算符相同的結果。 – nikartix

0

String.CompareTo如果字符串實例在排序順序中具有與提供的值相同的位置,則返回0。這與比較平等不同。所以我會期待你描述的結果。

1

你想StringComparison.Ordinal標誌:只是比較字符串按字典:

... 
bool b2 = (a.CompareTo(b, StringComparison.Ordinal) > 0); 
bool b3 = (a.CompareTo(b, StringComparison.Ordinal) < 0); 
bool b4 = (a.CompareTo(b, StringComparison.Ordinal) == 0); 
... 
相關問題