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 的数字分别为 -1
或 1
分别表示负数和正数,但没有要求只能是这些值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,您可以颠倒两个参数中哪一个应该先出现的决定,因此您会得到一个颠倒顺序的结果。
嗯...我完全重写了我的 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 的数字分别为 -1
或 1
分别表示负数和正数,但没有要求只能是这些值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, thenString.Compare(b, a)
should return a negative number
反之亦然
所以基本上,通过将参数的顺序颠倒为 String.Compare,您可以颠倒两个参数中哪一个应该先出现的决定,因此您会得到一个颠倒顺序的结果。