カルチャを認識しない文字列比較の実行

更新 : 2010 年 5 月

既定では、String.Compare メソッドはカルチャを認識し、大文字と小文字を区別する比較を実行します。 また、このメソッドには、使用するカルチャを culture パラメーターで指定し、使用する比較規則を comparisonType パラメーターで指定できる、複数のオーバーロードが含まれています。 既定のオーバーロードの代わりにこれらのメソッドを呼び出すと、特定のメソッド呼び出しで使用する規則に関するあいまいさが解消され、特定の比較がカルチャに依存するかどうかが明確になります。

メモメモ

String.CompareTo メソッドの両方のオーバーロードでは、カルチャに依存した比較と大文字と小文字を区別する比較を実行します。このメソッドを使用してカルチャに依存しない比較を実行することはできません。コードをわかりやすくするために、String.Compare メソッドを代わりに使用することをお勧めします。

カルチャに依存する操作の場合は、comparisonType パラメーターとして StringComparison.CurrentCulture 列挙値または StringComparison.CurrentCultureIgnoreCase 列挙値を指定します。 現在のカルチャ以外の指定されたカルチャを使用して、カルチャに依存した比較を実行する場合は、culture パラメーターとして、そのカルチャを表す CultureInfo オブジェクトを指定します。

String.Compare メソッドでサポートされている、カルチャに依存しない文字列比較は、言語的な比較 (インバリアント カルチャの並べ替え規則に基づきます) または非言語的な比較 (文字列内の文字の序数値に基づきます) です。 カルチャに依存しないほとんどの文字列比較は非言語的な比較です。 このような比較の場合は、comparisonType パラメーターとして StringComparison.Ordinal 列挙値または StringComparison.OrdinalIgnoreCase 列挙値を指定します。 たとえば、セキュリティに関する決定 (ユーザー名やパスワードの比較など) が文字列比較の結果に基づいて行われる場合は、この操作をカルチャに依存しない非言語的な比較に指定して、操作の結果が特定のカルチャまたは言語の規則に影響されないようにする必要があります (カルチャに依存した文字列比較により矛盾した結果がどのように生じるかを示す例については、「カスタムの大文字と小文字の対応規則および並べ替え規則」を参照してください)。

複数のカルチャからの対応する文字列を一貫した方法で言語的に処理する場合は、カルチャに依存しない言語的な文字列比較を使用します。 たとえば、アプリケーションのリスト ボックスに表示する単語の一覧で複数の文字セットが使用されている場合などに、現在のカルチャに関係なく同じ順序で単語を表示することが必要になります。 カルチャに依存しない言語的な比較用に、英語の言語規則に基づくインバリアント カルチャが .NET Framework によって定義されています。 カルチャに依存しない言語的な比較を実行するには、comparisonType パラメーターとして StringComparison.InvariantCulture または StringComparison.InvariantCultureIgnoreCase を指定します。

次の例では、カルチャに依存しない 2 つの非言語的な文字列比較を実行します。 最初の例では大文字小文字が区別されますが、2 番目の例では区別されません。

Public Class CompareSample
    Public Shared Sub Main()
        Dim string1 As String = "file"
        Dim string2 As String = "FILE"
        Dim compareResult As Integer

        compareResult = String.Compare(string1, string2, _
                                       StringComparison.Ordinal)   
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}", 
                          StringComparison.Ordinal, string1, string2, 
                          compareResult) 

        compareResult = String.Compare(string1, string2, 
                                       StringComparison.OrdinalIgnoreCase)
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}", 
                          StringComparison.OrdinalIgnoreCase, string1, string2, 
                          compareResult) 
    End Sub
End Class
' The example displays the following output:
'    Ordinal comparison of 'file' and 'FILE': 32
'    OrdinalIgnoreCase comparison of 'file' and 'FILE': 0
using System;

public class CompareSample
{
    public static void Main()
    {
        string string1 = "file";
        string string2 = "FILE";
        int compareResult = 0;

        compareResult = String.Compare(string1, string2, 
                                       StringComparison.Ordinal);
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}", 
                          StringComparison.Ordinal, string1, string2, 
                          compareResult); 

        compareResult = String.Compare(string1, string2, 
                                       StringComparison.OrdinalIgnoreCase);
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}", 
                          StringComparison.OrdinalIgnoreCase, string1, string2, 
                          compareResult); 
    }
}
// The example displays the following output:
//    Ordinal comparison of 'file' and 'FILE': 32
//    OrdinalIgnoreCase comparison of 'file' and 'FILE': 0

参照

参照

String.Compare

String.CompareTo

概念

固有カルチャのデータの比較と並べ替え

.NET Framework で文字列を使用するためのベスト プラクティス

その他の技術情報

カルチャを認識しない文字列操作の実行

履歴の変更

日付

履歴

理由

2010 年 5 月

文字列処理のベスト プラクティスを反映。

コンテンツ バグ修正