String.CompareTo与case

时间:2018-04-05 03:04:30

标签: c# .net

示例代码说明:

    int res1 = "a".CompareTo("A");  // res1 = -1
    int res2 = "ab".CompareTo("A");  // res2 = 1

我在最后看到res1 = -1res2 = 1,这有点出乎意料。 我认为res1将返回1,因为在 ASCII 图表上" A" (0x41)来自" a" (0x61)。

另外,对于res2来说,字符串的长度似乎有所不同似乎很奇怪。即如果" a"来自" A" (正如res1 = -1表示的那样),那么我会认为" a" withAnythingAfterIt也会出现在" A" withAnythingAfterIt之前。

有人能说些什么吗? 感谢。

2 个答案:

答案 0 :(得分:5)

这是预期的行为。 String.CompareTo(string)使用其排序顺序进行文化敏感比较。事实上,正如我们在源代码中看到的那样,它调用CultureInfo来完成工作:

public int CompareTo(String strB) {
    if (strB==null) {
        return 1;
    }

    return CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, 0);
}

你现在的文化在排序顺序中把'A'放在'a'之后,因为它是一个平局,但不是在'ab'之后,因为很明显'ab'在'a'或'A'之后出现在大多数类型中订单我知道。它只是执行其工作的打折机制:当排序顺序相同时,使用序数值!

答案 1 :(得分:1)

来自MSDN

定义

  

将此实例与指定的Object进行比较并指示是否   此实例在...之前,之后或出现在同一位置   排序顺序作为指定的对象。

请注意

  

CompareTo方法主要用于排序或   按字母顺序排列的操作。主要时不应该使用它   方法调用的目的是确定是否有两个字符串   当量。要确定两个字符串是否相同,请调用   等于方法。

CompareTo是一种实例方法。

如果第一个字符串较大,则结果为1.如果第一个字符串较小,则结果为-1。如果两个字符串相等,则结果为0.该数字实质上表示第一个字符串的“大”数。

Console.WriteLine("a".CompareTo("A")); // -1
Console.WriteLine("ab".CompareTo("A")); // 1
Console.WriteLine("a".CompareTo("a")); // 1
Console.WriteLine("ab".CompareTo("AB")); // -1
Console.WriteLine("A".CompareTo("a")); // 1
Console.WriteLine("AB".CompareTo("ab")); // 1
Console.WriteLine("A".CompareTo("A")); // 0