カルチャを認識しないコレクションの文字列操作の実行

既定ではカルチャを認識する動作を提供するクラスとメンバーは System.Collections 名前空間にあります。 CaseInsensitiveComparer クラスおよび CaseInsensitiveHashCodeProvider クラスのパラメーターなしのコンストラクターは、Thread.CurrentCulture プロパティを使用して新しいインスタンスを初期化します。 CollectionsUtil.CreateCaseInsensitiveHashtable メソッドのすべてのオーバーロードは、既定で Thread.CurrentCulture プロパティを使用して、Hashtable クラスの新しいインスタンスを作成します。 ArrayList.Sort メソッドのオーバーロードは、Thread.CurrentCulture を使用して既定でカルチャを認識した並べ替えを実行します。 SortedList での並べ替えと検索は、文字列がキーとして使用されるときに、Thread.CurrentCulture によって影響を受けることがあります。 このセクションで説明する推奨使用方法に従うと、Collections 名前空間のこれらのクラスとメソッドでカルチャを認識しない結果が得られます。

注意

CultureInfo.InvariantCulture を比較メソッドに渡すと、カルチャを認識しない比較が実行されます。 ただし、これによって、ファイル パス、レジストリ キー、環境変数などで、非言語的な比較が行われることはありません。 また、比較結果に基づいたセキュリティに関する決定もサポートされません。 非言語的な比較や、結果に基づくセキュリティに関する決定については、アプリケーションは StringComparison 値を受け入れる比較メソッドを使用する必要があります。 アプリケーションは StringComparison を渡します。

CaseInsensitiveComparer クラスと CaseInsensitiveHashCodeProvider クラスを使用する

CaseInsensitiveHashCodeProvider および CaseInsensitiveComparer のパラメーターなしのコンストラクターは、Thread.CurrentCulture を使用してクラスの新しいインスタンスを初期化し、その結果としてカルチャを認識した動作が行われます。 次のコード例は Hashtable を示します。これがカルチャを認識するのは、CaseInsensitiveHashCodeProviderCaseInsensitiveComparer のパラメーターなしのコンストラクターを使用するためです。

internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);

CaseInsensitiveComparer クラスと CaseInsensitiveHashCodeProvider クラスを使用してカルチャを認識しない Hashtable を作成したい場合は、culture パラメーターを受け取るコンストラクターを使用してこれらのクラスの新しいインスタンスを初期化します。 culture パラメーターに CultureInfo.InvariantCulture を指定してください。 カルチャを認識しない Hashtable を次のコード例で示します。

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

CollectionsUtil.CreateCaseInsensitiveHashTable メソッドを使用する

CollectionsUtil.CreateCaseInsensitiveHashTable メソッドは、文字列の大文字と小文字を無視する Hashtable クラスの新しいインスタンスを手早く作成する便利な方法です。 ただし、CollectionsUtil.CreateCaseInsensitiveHashTable メソッドのすべてのオーバーロードは、Thread.CurrentCulture プロパティを使用するためカルチャを認識します。 このメソッドを使用して、カルチャを認識しない Hashtable を作成することはできません。 カルチャを認識しない Hashtable を作成するには、cultureパラメーターを受け取る Hashtable コンストラクターを使用します。 culture パラメーターに CultureInfo.InvariantCulture を指定してください。 カルチャを認識しない Hashtable を次のコード例で示します。

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

SortedList クラスの使用

SortedListは、キーによって並べ替えられ、キーとインデックスを使ってアクセスできる、キーと値のペアのコレクションを表します。 文字列がキーであるときに SortedList を使用すると、並べ替えと検索が Thread.CurrentCulture プロパティの影響を受けることがあります。 SortedList でカルチャを認識しない動作を実行するには、comparer パラメーターを受け取るコンストラクターの 1 つを使用して SortedList を作成します。 comparer パラメーターは、キーの比較に使用される IComparer の実装を指定します。 このパラメーターには、キーを比較するために CultureInfo.InvariantCulture を使用するカスタム comparer クラスを指定してください。 次の例は、カルチャを認識しないカスタム comparer クラスです。これは SortedListコンストラクターの comparer パラメーターとして指定できます。

Imports System.Collections
Imports System.Globalization

Friend Class InvariantComparer
    Implements IComparer
    Private m_compareInfo As CompareInfo
    Friend Shared [Default] As New InvariantComparer()

    Friend Sub New()
        m_compareInfo = CultureInfo.InvariantCulture.CompareInfo
    End Sub

    Public Function Compare(a As Object, b As Object) As Integer _
            Implements IComparer.Compare
        Dim sa As String = CType(a, String)
        Dim sb As String = CType(b, String)
        If Not (sa Is Nothing) And Not (sb Is Nothing) Then
            Return m_compareInfo.Compare(sa, sb)
        Else
            Return Comparer.Default.Compare(a, b)
        End If
    End Function
End Class
using System;
using System.Collections;
using System.Globalization;

internal class InvariantComparer : IComparer
{
    private CompareInfo _compareInfo;
    internal static readonly InvariantComparer Default = new
        InvariantComparer();

    internal InvariantComparer()
    {
        _compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }

    public int Compare(Object a, Object b)
    {
        if (a is string sa && b is string sb)
            return _compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

一般に、SortedList を文字列に対して使用する際にカスタム invariant comparer を指定しないと、リストにデータが設定された後で、Thread.CurrentCulture に対する変更によってリストが無効になることがあります。

ArrayList.Sort メソッドを使用する

ArrayList.Sort メソッドのオーバーロードは、Thread.CurrentCultureプロパティを使用して、カルチャを認識する並べ替えを既定で実行します。 結果は、さまざまな並べ替え順序のためカルチャによって変わることがあります。 カルチャを認識した動作を回避するには、IComparer実装を受け入れるこのメソッドのオーバーロードを使用します。 comparer パラメーターには、CultureInfo.InvariantCulture を使用するカスタム invariant comparer クラスを指定してください。 カスタム invariant comparer クラスの例は、「SortedList クラスの使用」のトピックをご覧ください。

参照