.NET TIPS

大文字/小文字を区別しないで文字列を比較するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2007/07/26

 大文字/小文字を区別せずに2つの文字列を比較する場合、比較的よく見掛けるコードは次のようなif文だ。

if (strA.ToLower() == strB.ToLower()) {
  //
  // (大文字/小文字の違いはあるかもしれないが)
  // strAとstrBは同じ
  //
}
If strA.ToLower() = strB.ToLower() Then
  '
  ' (大文字小文字の違いはあるかもしれないが)
  '  strAとstrBは同じ
  '
End If
ToLowerメソッドを使用した文字列の比較(上:C#、下:VB)

 このif文では、Stringクラス(System名前空間)のToLowerメソッドにより、両方の文字列をまず小文字にしてから比較している(もちろん、ToUpperメソッドにより両方を大文字にしてから比較してもよい)。

 Stringクラスには文字列を比較するためのCompareメソッドも用意されている。このメソッドにより大文字/小文字を区別せずに文字列を比較するには、次のようにして行う。

if (String.Compare(strA, strB, true) == 0) {
  //
  // (大文字小文字の違いはあるかもしれないが)
  // strAとstrBは同じ
  //
}
If String.Compare(strA, strB, True) = 0 Then
  '
  ' (大文字/小文字の違いはあるかもしれないが)
  '  strAとstrBは同じ
  '
End If
Compareメソッドを使用した文字列の比較(上:C#、下:VB)

 このCompareメソッドでは、第3パラメータにtrueを指定することによって、大文字/小文字の区別なしに文字列を比較できる。

 これら2つのif文は機能的には同等だが、速度的には大きな差がある。次のサンプル・プログラムは、それぞれのif文を100万回ずつ実行して、それにかかる時間を調べている。

// ignorecase.cs

using System;
using System.Diagnostics;

class StringCompareWithIgnoreCase {
  static void Main() {

    Stopwatch sw;
    string strA = "table";
    string strB = "TABLE";

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 1000000; i++) {
      if (strA.ToLower() == strB.ToLower()) {
        // do nothing.
      }
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds + "ミリ秒");
    // 出力例:631ミリ秒

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 1000000; i++) {
      if (String.Compare(strA, strB, true) == 0) {
        // do nothing.
      }
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds + "ミリ秒");
    // 出力例:319ミリ秒
  }
}

// コンパイル方法:csc ignorecase.cs
大文字/小文字の区別なしに文字列を比較するC#のサンプル・プログラム(ignorecase.cs)

' ignorecase.vb

Imports System
Imports System.Diagnostics

Class StringCompareWithIgnoreCase
  Shared Sub main()

    Dim sw As Stopwatch
    Dim strA As String = "table"
    Dim strB As String = "TABLE"

    sw = Stopwatch.StartNew()
    For i As Integer = 1 To 1000000
      If strA.ToLower() = strB.ToLower() Then
        ' do nothing.
      End If
    Next
    sw.Stop()
    Console.WriteLine(sw.ElapsedMilliseconds & "ミリ秒")
    ' 出力例:631ミリ秒

    sw = Stopwatch.StartNew()
    For i As Integer = 1 To 1000000
      If String.Compare(strA, strB, True) = 0 Then
        ' do nothing.
      End If
    Next
    sw.Stop()
    Console.WriteLine(sw.ElapsedMilliseconds & "ミリ秒")
    ' 出力例:319ミリ秒
  End Sub
End Class

' コンパイル方法:vbc ignorecase.vb
大文字/小文字を区別せずに文字列を比較するVBのサンプル・プログラム(ignorecase.vb)

 コメントで示した処理時間は筆者のPC(Pentium 4、3GHz)で実行したときの値だが、Compareメソッドの方がほぼ2倍の速度となっているのが分かる。

 前者のToLowerメソッドを使ったif文が遅いのは、比較の際に(少なくとも)2つの文字列インスタンスが作成されるためだ。これに対して、後者のCompareメソッドでは、内部でそのような文字列インスタンスを作成せずに比較を行っているものと思われる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)

この記事と関連性の高い別の.NET TIPS
配列を独自の順序でソート(並べ替え)するには?
アルファベットを大文字/小文字に変換するには?
文字列に特定の文字列が含まれているかを調べるには?(Contains編)
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH