String.Compare 及其实际运作方式(IComparable 实现)

String.Compare and how it actually function (IComparable implementation)

嗯...我完全重写了我的 post 以让任何人都能理解我真正想要理解的东西。我只想了解 String.Compare (string, string) 实际上是如何工作的,并了解哪个字符串在前面,哪个在后面。 MSDN 对它的描述相当混乱 imo.Here 是我的代码并且它工作正常:

 internal class Animal: IComparable<Animal>
{
    public Animal(string name)
    {
        Name = name;
    }

    public string Name { get; private set; }

    static string[] animalsStringArray = { "Bull", "Frog", "Elephant", "Cat", "Dog", "Bird", "Horse" };
    public static Animal[] CreateAnimalsArray()
    {
        Animal[] animals = new Animal[animalsStringArray.Length];
        for (int i = 0; i< animalsStringArray.Length; i++)
        {
            animals[i] = new Animal(animalsStringArray[i]);
        }
        return animals;
    }
    public int CompareTo(Animal rightAnimal)
    {
        Animal leftAnimal = this;
        return String.Compare(leftAnimal.Name, rightAnimal.Name);
    }
    public override string ToString()
    {
        return Name;
    }
}

internal class Program
{
    public static void DisplayArray(IComparable<Animal>[] comp)
    {
        int num = 1;
        foreach (Animal s in comp)
        {
            Console.WriteLine("Name {0} is: {1}", num++, s.ToString());
        }
    }

    static void Main(string[] args)
    {
        Animal[] animals = Animal.CreateAnimalsArray();
        Console.WriteLine("\n\nHere is the animals array before being sorted out: ");
        DisplayArray(animals);
        Console.WriteLine("\n\nHere is the animals array after being sorted out: ");
        Array.Sort(animals);
        DisplayArray(animals);
        Console.WriteLine("\n\nPress Enter to terminate...");
        Console.ReadKey();
    }
}

这里是实际输出:

整理前的动物数组如下:

名字 1 是:公牛

姓名 2 是:青蛙

名字 3 是:大象

名字 4 是:Cat

名字 5 是:狗

姓名 6 是:鸟

名字 7 是:马

整理后的动物数组如下:

名字 1 是:鸟

名字 2 是:公牛

名字 3 是:Cat

名字 4 是:狗

名字 5 是:大象

名字 6 是:青蛙

名字 7 是:马

按 Enter 键终止...

但是,如果我将在 Animal class 中切换 CompareTo() 方法的位置参数,那么由于某些原因,结果将是荒谬的。为什么? 这是我换位置的意思:

public int CompareTo(Animal rightAnimal)
    {
        Animal leftAnimal = this;
        return String.Compare(rightAnimal.Name, leftAnimal.Name);
    }

进行这些更改后,输出将如下所示: 这是整理前的动物数组:

名字 1 是:公牛

姓名 2 是:青蛙

名字 3 是:大象

名字 4 是:Cat

名字 5 是:狗

姓名 6 是:鸟

名字 7 是:马

整理后的动物数组如下:

名字 1 是:马

姓名 2 是:青蛙

名字 3 是:大象

名字 4 是:狗

名字 5 是:Cat

名字 6 是:公牛

名字 7 是:鸟

按 Enter 键终止...

某种相反的顺序。但为什么? 这些人 (https://www.geeksforgeeks.org/how-to-compare-strings-in-c-sharp/) 正在使用“按字典顺序”这个词(注意他们没有按字母顺序使用这个词),但他们没有破译它的意思。我知道这就像基于一种文化。我觉得这可能很容易,但我还是很困惑。

这与 String.Compare 的功能完全无关,只是它遵循与 CompareTo 相同的合同,如下所示:

String.Compare(a, b) returns negative number  --> a should come before b
String.Compare(a, b) returns positive number  --> b should come before a
String.Compare(a, b) returns zero             --> a and b are equivalent

(通常,returned 的数字分别为 -11 分别表示负数和正数,但没有要求只能是这些值returned。例如,如果您正在比较数字并且不需要考虑不足或溢出,您可以简单地执行 a-b 以获得差异,然后映射到负值或正值取决于哪个较低。)

CompareTo 预计会出现完全相同的行为:

a.CompareTo(b) returns negative number        --> a should come before b
a.CompareTo(b) returns positive number        --> b should come before a
a.CompareTo(b) returns zero                   --> a and b are equivalent

您观察到的是,将两种方法的参数反转实际上 return 值的相反符号。

示例:

if String.Compare(a, b) returns a positive number, then String.Compare(b, a) should return a negative number

反之亦然

所以基本上,通过将参数的顺序颠倒为 String.Compare,您可以颠倒两个参数中哪一个应该先出现的决定,因此您会得到一个颠倒顺序的结果。