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
クラスを使用する
CaseInsensitiveHashCodeProvider
とCaseInsensitiveComparer
のパラメーターなしのコンストラクターは、Thread.CurrentCulture
を使用してクラスの新しいインスタンスを初期化し、カルチャに依存する動作になります。 次のコード例では、Hashtable
とCaseInsensitiveHashCodeProvider
にパラメーターなしのコンストラクターを使用するため、カルチャに依存する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 クラスの使用 」トピックで提供されています。
こちらも参照ください
.NET