検索
連載

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

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「.NET TIPS」のインデックス

連載目次

 大文字/小文字を区別せずに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.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)
ignorecase.vbのダウンロード

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

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

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

「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る