PG日誌

各記事はブラウザの横幅を1410px以上にすると2カラムの見出しが表示されます。なるべく横に広げてみてください。

【C#】文字列を大文字・小文字を区別しないで比較する

C#で文字列どうしを大文字と小文字の区別しないで比較する方法の紹介とちょっとした便利ネタの紹介です。

大文字と小文字を区別しないで比較する方法

標準ライブラリの範囲内で大文字と小文字を区別しないで文字列比較する方法は以下の3つの方法があります。

// (1) 全部小文字にしてから比較
if (a.ToLower() == b.ToLower())
{
    Console.WriteLine("a == b");
}

// (2) string 型にある Compare メソッドでオプション指定する
if (string.Compare(a, b, true) == 0)
{
    Console.WriteLine("a == b");
}

// (3) 最初から大文字と小文字を区別しない定義がるのでをれを利用する
if (StringComparer.CurrentCultureIgnoreCase.Compare(a, b) == 0)
{
    Console.WriteLine("a == b");
}

(2) の string.Compare メソッドを使用した処理方法が最も一般的な処理です。(1) の全部小文字に変換するのは処理効率があまりよろしくありません。(3)は長いだけで(2)と同じです。

この記述ですが、文字列比較をする場合定型文として繰り返し書く事になりますが、長ったらしいので拡張メソッド化してついでに複数同時に比較できるように機能拡張してライブラリ化したいと思います。

拡張メソッドを定義する

以下のように文字列に拡張メソッドの機能を使ってメソッドを追加して簡単に比較できるようにします。戻り値もboolに変更して同じだったら true、異なる場合 false に変更します。

実装後の処理の使い方は以下の通りです。

// 使い方(1件)
string a = "a";
bool result = a.CompareIgnore("A");

// 複数件の比較
result = a.CompareIgnore("AA", "BB", "CC", "A");

拡張メソッド定義は以下のように記述します。

public static class StringExtension
{
    // 文字列を大文字・小文字を無視して比較する拡張メソッド
    public static bool CompareIgnore(this string self, string target)
    {
        return string.Compare(self, target) == 0;
    }

    // 複数の文字列を大文字・小文字を無視して比較する拡張メソッド
    public static bool CompareIgnore(this string self, params string[] targets)
    {
        int len = targets.Length;
        for (int i = 0; i < len; i++)
        {
            if (self.CompareIgnore(targets[i]))
            {
                return true;
            }
        }

        return false;
    }
}

1件と複数件はC#側で適切にオーバーロードを選択してくれるので1件の時には1件用のメソッドが呼び出されます。