カルチャを認識しないコレクションの文字列操作の実行
既定ではカルチャを認識する動作を提供するクラスとメンバーは 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
を示します。これがカルチャを認識するのは、CaseInsensitiveHashCodeProvider
と CaseInsensitiveComparer
のパラメーターなしのコンストラクターを使用するためです。
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 クラスの使用」のトピックをご覧ください。
参照
.NET