2016-08-02 43 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); 
... 
相关问题