String.Compare を使用して 2 つの文字列を比較しようとする単純なアプリケーションがあります。各文字列に値を追加すると、答えが変わる状況に遭遇しました。
次の 2 つの文字列を使用します。
---a
--1S
String.Compare は、文字列内の値の増加を比較すると、次の結果を示します。
String.Compare
-: - 0
--: -- 0
---: --1 -1
---a:--1S 1
なぜ答えを変えるのですか?文字列に追加された追加の値に関係なく、3 番目の位置に到達すると、-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