大文字/小文字を区別せずに2つの文字列を比較する場合、比較的よく見掛けるコードは次のようなif文だ。
if (strA.ToLower() == strB.ToLower()) {
//
// (大文字/小文字の違いはあるかもしれないが)
// strAとstrBは同じ
//
}
If strA.ToLower() = strB.ToLower() Then
'
' (大文字/小文字の違いはあるかもしれないが)
' strAとstrBは同じ
'
End If
この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メソッドでは、第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
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
ignorecase.vbのダウンロード
コメントで示した処理時間は筆者のPC(Pentium 4、3GHz)で実行したときの値だが、Compareメソッドの方がほぼ2倍の速度となっているのが分かる。
前者のToLowerメソッドを使ったif文が遅いのは、比較の際に(少なくとも)2つの文字列インスタンスが作成されるためだ。これに対して、後者のCompareメソッドでは、内部でそのような文字列インスタンスを作成せずに比較を行っているものと思われる。
カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)
Copyright© Digital Advantage Corp. All Rights Reserved.