【C#】大文字・小文字を区別せずに文字列を比較する方法:EqualsとStringComparison

目次

文字列比較における大文字と小文字の問題

C#において、== 演算子を使用して2つの文字列を比較する場合、デフォルトでは大文字と小文字が厳密に区別されます

string strA = "File_Data.csv";
string strB = "file_data.csv";

bool areEqual = (strA == strB); // false になります

しかし、ユーザー入力の検証(例: ユーザー名 adminADMIN を同一とみなす)や、ファイル名の照合など、多くの実用的な場面では大文字・小文字を区別せずに比較したいという要求があります。

この問題を解決するために、string.Equals メソッドと StringComparison 列挙型を使用します。


string.EqualsStringComparison

string.Equals メソッドには、比較のルール(StringComparison)を明示的に指定できるオーバーロード(引数が異なる同名メソッド)が用意されています。

基本構文: stringA.Equals(stringB, StringComparison.ComparisonType)

ComparisonType(比較ルール)を指定することで、大文字・小文字を無視した比較が可能になります。

StringComparison の主なオプション

大文字・小文字を無視する比較ルールとして、主に以下の2つがあります。

  • StringComparison.OrdinalIgnoreCase
    • 推奨される方法です。
    • 文字列を内部的な数値(序数値)として比較し、大文字・小文字の区別を無視します。
    • OSの地域設定(カルチャ)に依存せず、一貫性があり高速に動作します。セキュリティ関連や内部的なデータ処理に適しています。
  • StringComparison.CurrentCultureIgnoreCase
    • プログラムが実行されているOSの現在のカルチャ(地域設定、例: トルコ語の i の扱いなど)に基づいて、大文字・小文字の区別を無視します。
    • ユーザーに表示する文字列を、そのユーザーの言語ルールでソート(並べ替え)するような特殊な場合に使用されますが、一般的な等価比較ではOrdinalIgnoreCaseが推奨されます。

コード例:==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 を指定する方法が、最も標準的で信頼性の高い方法です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次