Durchführen kulturunabhängiger Zeichenfolgenoperationen in Sammlungen
Der System.Collections-Namespace enthält Klassen und Member, die standardmäßig kulturabhängiges Verhalten bereitstellen. Die parameterlosen Konstruktoren für die CaseInsensitiveComparer- und CaseInsensitiveHashCodeProvider-Klasse initialisieren eine neue Instanz mit der Thread.CurrentCulture-Eigenschaft. Alle Überladungen der CollectionsUtil.CreateCaseInsensitiveHashtable-Methode erstellen eine neue Instanz der Hashtable-Klasse standardmäßig mit der Thread.CurrentCulture
-Eigenschaft. Überladungen der ArrayList.Sort-Methode führen kulturabhängige Sortierungen standardmäßig mit der Thread.CurrentCulture
-Eigenschaft aus. Wenn Zeichenfolgen als Schlüssel verwendet werden, kann sich SortedList auf das Sortieren und Nachschlagen in einer Thread.CurrentCulture
-Instanz auswirken. Befolgen Sie die Verwendungsempfehlungen in diesem Abschnitt, um aus diesen Klassen und Methoden im Collections
-Namespace kulturunabhängige Ergebnisse abzurufen.
Hinweis
Wenn Sie CultureInfo.InvariantCulture einer Vergleichsmethode übergeben, wird ein kulturunabhängiger Vergleich ausgeführt. Dies bewirkt jedoch keinen nicht linguistischen Vergleich, z. B. auf Dateipfade, Registrierungsschlüssel und Umgebungsvariablen. Und dadurch werden auch keine Sicherheitsentscheidungen anhand des Vergleichsergebnisses unterstützt. Für einen nicht linguistischen Vergleich oder Unterstützung für ergebnisbasierte Sicherheitsentscheidungen sollte die Anwendung eine Vergleichsmethode verwenden, die einen StringComparison-Wert akzeptiert. Die Anwendung sollte dann StringComparison übergeben.
Verwenden der CaseInsensitiveComparer
- und CaseInsensitiveHashCodeProvider
-Klassen
Die parameterlosen Konstruktoren für CaseInsensitiveHashCodeProvider
und CaseInsensitiveComparer
initialisieren eine neue Instanz der Klasse mit Thread.CurrentCulture
, was zu kulturabhängigem Verhalten führt. Im folgenden Codebeispiel wird der Konstruktor für eine Hashtable
-Instanz veranschaulicht, die kulturabhängig ist, weil für sie die parameterlosen Konstruktoren für CaseInsensitiveHashCodeProvider
und CaseInsensitiveComparer
verwendet werden.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Wenn Sie eine kulturunabhängige Hashtable
-Instanz über die Klassen CaseInsensitiveComparer
und CaseInsensitiveHashCodeProvider
erstellen möchten, initialisieren Sie neue Instanzen dieser Klassen mit den Konstruktoren, die einen culture
-Parameter akzeptieren. Für den culture
-Parameter geben Sie CultureInfo.InvariantCulture an. Im folgenden Codebeispiel wird der Konstruktor für eine kulturunabhängige Hashtable
-Instanz veranschaulicht.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Verwenden der CollectionsUtil.CreateCaseInsensitiveHashTable
-Methode
Die CollectionsUtil.CreateCaseInsensitiveHashTable
-Methode ist eine nützliche Abkürzung zum Erstellen einer neuen Instanz der Hashtable
-Klasse, in der die Groß-/Kleinschreibung von Zeichenfolgen ignoriert wird. Alle Überladungen der CollectionsUtil.CreateCaseInsensitiveHashTable
-Methode sind jedoch kulturabhängig, da in ihnen die Thread.CurrentCulture
-Eigenschaft verwendet wird. Sie können mit dieser Methode keine kulturunabhängige Hashtable
-Instanz erstellen. Um eine kulturunabhängige Hashtable
-Instanz zu erstellen, verwenden Sie den Hashtable
-Konstruktor, der einen culture
-Parameter akzeptiert. Für den culture
-Parameter geben Sie CultureInfo.InvariantCulture
an. Im folgenden Codebeispiel wird der Konstruktor für eine kulturunabhängige Hashtable
-Instanz veranschaulicht.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
Verwenden der SortedList
-Klasse
Eine SortedList
-Instanz entspricht einer Auflistung von Schlüssel-Wert-Paaren, die nach Schlüsseln sortiert sind und auf die sowohl über Schlüssel als auch über Index zugegriffen werden kann. Wenn Sie eine SortedList
-Instanz verwenden, in der Zeichenfolgen als Schlüssel verwendet werden, können Sortier- und Nachschlagevorgänge durch die Thread.CurrentCulture
-Eigenschaft beeinflusst werden. Um für eine SortedList
-Instanz kulturunabhängiges Verhalten zu erzielen, erstellen Sie die SortedList
-Instanz mit einem Konstruktor, der einen comparer
-Parameter akzeptiert. Der comparer
-Parameter gibt die IComparer-Implementierung an, die beim Vergleich von Schlüsseln zu verwenden ist. Geben Sie für den Parameter eine benutzerdefinierte Comparer-Klasse an, in der CultureInfo.InvariantCulture
verwendet wird, um Schlüssel zu vergleichen. Das folgende Beispiel veranschaulicht eine benutzerdefinierte kulturunabhängige Comparer-Klasse, die Sie als comparer
-Parameter für einen SortedList
-Konstruktor angeben können.
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);
}
}
Wenn Sie eine SortedList
-Instanz für Zeichenfolgen verwenden, ohne eine benutzerdefinierte invariante Comparer-Klasse zu verwenden, gilt grundsätzlich, dass ein Ändern von Thread.CurrentCulture
, nachdem die Liste aufgefüllt wurde, dazu führen kann, dass die Liste ungültig wird.
Verwenden der ArrayList.Sort
-Methode
Überladungen der ArrayList.Sort
-Methode führen kulturabhängige Sortierungen standardmäßig mit der Thread.CurrentCulture
-Eigenschaft aus. Die Ergebnisse können je nach Kultur aufgrund der unterschiedlichen Sortierreihenfolgen variieren. Um kulturabhängiges Verhalten zu vermeiden, verwenden Sie die Überladung dieser Methode, die eine IComparer
-Implementierung akzeptieren. Geben Sie für den comparer
-Parameter eine benutzerdefinierte invariante Comparer-Klasse an, in der CultureInfo.InvariantCulture
verwendet wird. Ein Beispiel für eine benutzerdefinierte invariante Comparer-Klasse finden Sie im Thema Verwenden der SortedList-Klasse.