我有一个简单的应用程序,它尝试使用 String.Compare 比较 2 个字符串。我遇到了一种情况,当我向每个字符串添加更多值时,答案会发生变化。
取这两个字符串:
---a
--1S
当比较字符串中越来越多的值时,String.Compare 显示以下结果:
String.Compare
-: - 0
--: -- 0
---: --1 -1
---a:--1S 1
为什么它会改变答案?一旦到达第三个位置,它应该保持 -1,无论添加到字符串中的附加值如何。
另一方面,String.CompareOrdinal
同意这一点,并且对于所有字符串长度都保持 < 0。
这是一个演示这些结果的示例程序。
using System;
namespace TestFileMerge
{
public static class Program
{
public static void Main(string[] args)
{
const string value1 = "---a";
const string value2 = "--1S";
Console.WriteLine("String.Compare");
for (int i = 1; i <= value1.Length; i++)
{
Console.WriteLine(
@"{0}:{1} {2}",
value1.Substring(0, i).PadLeft(value2.Length),
value2.Substring(0, i).PadLeft(value2.Length),
String.Compare(
value1.Substring(0, i),
value2.Substring(0, i),
false
).ToString().PadLeft(3));
}
Console.WriteLine("String.Compare -- ignore case");
for (int i = 1; i <= value1.Length; i++)
{
Console.WriteLine(
@"{0}:{1} {2}",
value1.Substring(0, i).PadLeft(value2.Length),
value2.Substring(0, i).PadLeft(value2.Length),
String.Compare(
value1.Substring(0, i),
value2.Substring(0, i),
true
).ToString().PadLeft(3));
}
Console.WriteLine("String.CompareOrdinal");
for (int i = 1; i <= value1.Length; i++)
{
Console.WriteLine
(@"{0}:{1} {2}",
value1.Substring(0, i).PadLeft(value2.Length),
value2.Substring(0, i).PadLeft(value2.Length),
String.CompareOrdinal(
value1.Substring(0, i),
value2.Substring(0, i)
).ToString().PadLeft(3));
}
}
}
}
这会产生以下输出:
String.Compare
-: - 0
--: -- 0
---: --1 -1
---a:--1S 1
String.Compare -- ignore case
-: - 0
--: -- 0
---: --1 -1
---a:--1S 1
String.CompareOrdinal
-: - 0
--: -- 0
---: --1 -4
---a:--1S -4