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.

Weitere Informationen