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

C# String: why string a == b operator gives different answer than a.CompareTo(b) == 0?

我把 C# 搞得一团糟,发现一段代码给出了非常不舒服的结果:

static void Main(string[] args)
    {
        string a = "string", b = "string[=11=]";
        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

String.CompareTo returns 如果字符串实例在排序顺序中的位置与提供的值相同,则为 0。这与比较是否相等不同。所以我希望你描述的结果。

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

根据 the documentation:

Character sets include ignorable characters. The CompareTo(String) method does not consider such characters when it performs a culture-sensitive comparison.

你想要 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);
...