2つの文字列の部分比較
C#で文字列の先頭が特定のパターンで始まるかを調べるにはStartsWithメソッドが便利です。しかし、「2つの異なる文字列があり、それらの先頭からN文字目までが互いに一致するか」を判定したい場合、StartsWithでは対応が困難です。
例えば、"LogEntry: 2025-11-09..." と "LogEntry: 2025-11-08..." という2つのログ文字列の、先頭10文字("LogEntry: "の部分)が共通しているかを確認したい場合などです。
このような「文字列AのX番目から」と「文字列BのY番目から」を「N文字分」比較する、といった詳細な比較操作には string.Compare メソッドの特定のオーバーロード(引数の種類が異なるメソッド)が非常に有効です。
string.Compare (部分比較) メソッド
string.Compare は、文字列を辞書順で比較するための静的メソッドです。通常は string.Compare(strA, strB) のように使われますが、比較する「範囲」を指定できるオーバーロードが存在します。
主な構文: string.Compare(string strA, int indexA, string strB, int indexB, int length)
strA: 比較する最初の文字列。indexA:strAの比較を開始する位置(0から始まるインデックス)。strB: 比較する2番目の文字列。indexB:strBの比較を開始する位置。length: 比較する文字数。
戻り値 (int):
0: 指定した部分文字列が等しい。0未満:strAの部分文字列がstrBよりも辞書順で小さい(先に来る)。0より大きい:strAの部分文字列がstrBよりも辞書順で大きい(後に来る)。
コード例:先頭N文字の一致を判定
2つのバージョン情報文字列があり、”バージョンプレフィックス”(例: Version-1.) の部分、具体的には先頭8文字が一致しているかを確認する例です。
if (string.Compare(...) == 0) のように、戻り値が 0 であるかを判定することで、一致・不一致を確認します。
using System;
public class StringCompareRangeExample
{
public static void Main()
{
string versionInfoA = "Version-1.A_Build_001";
string versionInfoB = "Version-1.B_Build_999";
int startIndexA = 0; // Aの比較開始位置 (先頭)
int startIndexB = 0; // Bの比較開始位置 (先頭)
int compareLength = 8; // 先頭から8文字 ("Version-") を比較
Console.WriteLine($"A: {versionInfoA}");
Console.WriteLine($"B: {versionInfoB}");
// 先頭8文字 ("Version-") を比較
// (string.Compare(...) == 0) が true となる
if (string.Compare(versionInfoA, startIndexA, versionInfoB, startIndexB, compareLength) == 0)
{
Console.WriteLine($"先頭 {compareLength} 文字は一致しています。");
}
else
{
Console.WriteLine($"先頭 {compareLength} 文字は一致していません。");
}
// 比較する長さを10に変更 (Aは "Version-1.A", Bは "Version-1.B")
compareLength = 10;
if (string.Compare(versionInfoA, startIndexA, versionInfoB, startIndexB, compareLength) == 0)
{
Console.WriteLine($"先頭 {compareLength} 文字は一致しています。");
}
else
{
Console.WriteLine($"先頭 {compareLength} 文字は一致していません。");
}
}
}
出力結果:
A: Version-1.A_Build_001
B: Version-1.B_Build_999
先頭 8 文字は一致しています。
先頭 10 文字は一致していません。
応用:大文字・小文字を無視した比較
string.Compare メソッドは、大文字・小文字の区別を無視するオプションも提供しています。引数に StringComparison 列挙型を指定するオーバーロードを使用します。
構文: string.Compare(string strA, int indexA, string strB, int indexB, int length, StringComparison comparisonType)
コード例(大文字・小文字無視)
"File_Data:" と "file_data:" のように大文字・小文字が異なる文字列の先頭10文字を比較します。
using System;
public class StringCompareIgnoreCaseExample
{
public static void Main()
{
string dataHeaderA = "File_Data: CSV_Content...";
string dataHeaderB = "file_data: TXT_Content...";
int compareLength = 10; // "File_Data:" の部分
// 比較ルール: 大文字・小文字を無視
StringComparison rule = StringComparison.OrdinalIgnoreCase;
// string.Compare(...) == 0 で判定
if (string.Compare(dataHeaderA, 0, dataHeaderB, 0, compareLength, rule) == 0)
{
Console.WriteLine($"先頭 {compareLength} 文字は (大文字/小文字を無視して) 一致しています。");
}
else
{
Console.WriteLine("一致しません。");
}
}
}
出力結果:
先頭 10 文字は (大文字/小文字を無視して) 一致しています。
まとめ
string.Compare の範囲指定オーバーロードは、2つの文字列の任意の部分同士を比較するための強力なメソッドです。
StartsWithでは行えない、2つの異なる文字列の先頭N文字の比較が可能です。- 戻り値が
intであり、== 0かどうかで「一致」を判定します。 StringComparisonオプションを指定することで、大文字・小文字を無視した柔軟な比較も行えます。
