C#String:为什么字符串a == b运算符给出的答案不同于a.CompareTo(b)== 0?

时间:2016-08-02 18:37:29

标签: c# string comparison

我用C#搞砸了一下,发现了一个非常不舒服的代码:

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

3 个答案:

答案 0 :(得分:8)

CompareTo的结果并不意味着平等,它与排序顺序有关。我不确定为排序目的忽略空字符太令人惊讶。

the documentation

  

字符集包括可忽略的字符。 CompareTo(String)方法在执行区域性敏感比较时不考虑这些字符。

答案 1 :(得分: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);
...

答案 2 :(得分:0)

如果字符串实例在排序顺序中与提供的值具有相同的位置,则

String.CompareTo返回0。这与比较平等有所不同。所以我期待你所描述的结果。