文字列比較における大文字と小文字の問題
C#において、== 演算子を使用して2つの文字列を比較する場合、デフォルトでは大文字と小文字が厳密に区別されます。
string strA = "File_Data.csv";
string strB = "file_data.csv";
bool areEqual = (strA == strB); // false になります
しかし、ユーザー入力の検証(例: ユーザー名 admin と ADMIN を同一とみなす)や、ファイル名の照合など、多くの実用的な場面では大文字・小文字を区別せずに比較したいという要求があります。
この問題を解決するために、string.Equals メソッドと StringComparison 列挙型を使用します。
string.Equals と StringComparison
string.Equals メソッドには、比較のルール(StringComparison)を明示的に指定できるオーバーロード(引数が異なる同名メソッド)が用意されています。
基本構文: stringA.Equals(stringB, StringComparison.ComparisonType)
ComparisonType(比較ルール)を指定することで、大文字・小文字を無視した比較が可能になります。
StringComparison の主なオプション
大文字・小文字を無視する比較ルールとして、主に以下の2つがあります。
StringComparison.OrdinalIgnoreCase- 推奨される方法です。
- 文字列を内部的な数値(序数値)として比較し、大文字・小文字の区別を無視します。
- OSの地域設定(カルチャ)に依存せず、一貫性があり高速に動作します。セキュリティ関連や内部的なデータ処理に適しています。
StringComparison.CurrentCultureIgnoreCase- プログラムが実行されているOSの現在のカルチャ(地域設定、例: トルコ語の
iの扱いなど)に基づいて、大文字・小文字の区別を無視します。 - ユーザーに表示する文字列を、そのユーザーの言語ルールでソート(並べ替え)するような特殊な場合に使用されますが、一般的な等価比較では
OrdinalIgnoreCaseが推奨されます。
- プログラムが実行されているOSの現在のカルチャ(地域設定、例: トルコ語の
コード例:== と Equals の比較
"admin_user" と "ADMIN_USER" という2つの文字列を、異なる方法で比較してみます。
using System;
public class StringComparisonExample
{
public static void Main()
{
string userInput = "admin_user";
string databaseValue = "ADMIN_USER";
Console.WriteLine($"文字列A: {userInput}");
Console.WriteLine($"文字列B: {databaseValue}");
Console.WriteLine("---");
// 1. '==' 演算子での比較 (厳密に区別される)
if (userInput == databaseValue)
{
Console.WriteLine("== 演算子: 一致しました。");
}
else
{
Console.WriteLine("== 演算子: 一致しません。 (大文字/小文字を区別)");
}
// 2. Equals + OrdinalIgnoreCase での比較 (推奨)
// 大文字・小文字を無視して比較
if (userInput.Equals(databaseValue, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Equals (OrdinalIgnoreCase): 一致しました。");
}
else
{
Console.WriteLine("Equals (OrdinalIgnoreCase): 一致しません。");
}
}
}
出力結果:
文字列A: admin_user
文字列B: ADMIN_USER
---
== 演算子: 一致しません。 (大文字/小文字を区別)
Equals (OrdinalIgnoreCase): 一致しました。
まとめ
C#で大文字・小文字を区別せずに2つの文字列が等しいか(一致するか)を判定する場合は、== 演算子を使用してはいけません。
strA.Equals(strB, StringComparison.OrdinalIgnoreCase)
string.Equals メソッドと、比較ルールとして StringComparison.OrdinalIgnoreCase を指定する方法が、最も標準的で信頼性の高い方法です。
