次の方法で共有


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

System.Collections名前空間には、カルチャに依存する動作を既定で提供するクラスとメンバーがあります。 CaseInsensitiveComparerクラスとCaseInsensitiveHashCodeProvider クラスのパラメーターなしのコンストラクターは、Thread.CurrentCulture プロパティを使用して新しいインスタンスを初期化します。 CollectionsUtil.CreateCaseInsensitiveHashtable メソッドのすべてのオーバーロードは、既定で Hashtable プロパティを使用して、Thread.CurrentCulture クラスの新しいインスタンスを作成します。 ArrayList.Sort メソッドのオーバーロードは、Thread.CurrentCultureを使用して、カルチャに依存する並べ替えを既定で実行します。 文字列がキーとして使用されている場合、 SortedList での並べ替えと参照は Thread.CurrentCulture の影響を受ける可能性があります。 このセクションで示されている使用に関する推奨事項に従って、 Collections 名前空間のこれらのクラスとメソッドからカルチャを認識しない結果を取得します。

比較メソッドに CultureInfo.InvariantCulture を渡すと、カルチャに依存しない比較が実行されます。 ただし、ファイル パス、レジストリ キー、環境変数など、言語以外の比較は発生しません。 どちらの場合も、比較結果に基づくセキュリティ上の決定はサポートされません。 言語以外の比較や結果ベースのセキュリティ決定のサポートについては、アプリケーションで、 StringComparison 値を受け入れる比較メソッドを使用する必要があります。 その後、アプリケーションは StringComparison渡す必要があります。

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

CaseInsensitiveHashCodeProviderCaseInsensitiveComparerのパラメーターなしのコンストラクターは、Thread.CurrentCultureを使用してクラスの新しいインスタンスを初期化し、カルチャに依存する動作になります。 次のコード例では、HashtableCaseInsensitiveHashCodeProviderにパラメーターなしのコンストラクターを使用するため、カルチャに依存するCaseInsensitiveComparerのコンストラクターを示します。

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

HashtableクラスとCaseInsensitiveComparer クラスを使用してカルチャに依存しないCaseInsensitiveHashCodeProviderを作成する場合は、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を作成するには、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));

SortedList クラスを使用する

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

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 を使用すると、リストが設定された後に Thread.CurrentCulture を変更すると、リストが無効になることがあります。

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

ArrayList.Sort メソッドのオーバーロードは、Thread.CurrentCulture プロパティを使用して、カルチャに依存する並べ替えを既定で実行します。 結果は、並べ替え順序が異なるため、カルチャによって異なる場合があります。 カルチャに依存する動作を排除するには、 IComparer 実装を受け入れるこのメソッドのオーバーロードを使用します。 comparer パラメーターには、CultureInfo.InvariantCultureを使用するカスタムインバリアント 比較子クラスを指定します。 カスタムインバリアント 比較子クラスの例は、「 SortedList クラスの使用 」トピックで提供されています。

こちらも参照ください