Freigeben über


Durchführen kulturunabhängiger Zeichenfolgenoperationen in Sammlungen

Es gibt Klassen und Member im System.Collections Namespace, die standardmäßig kultursensitives Verhalten bereitstellen. Die parameterlosen Konstruktoren für die CaseInsensitiveComparer und CaseInsensitiveHashCodeProvider Klassen initialisieren eine neue Instanz mithilfe der Thread.CurrentCulture Eigenschaft. Alle Überladungen der CollectionsUtil.CreateCaseInsensitiveHashtable Methode erstellen standardmäßig eine neue Instanz der Hashtable Klasse mit der Thread.CurrentCulture Eigenschaft. Überladungen der ArrayList.Sort-Methode führen mithilfe von Thread.CurrentCulture standardmäßig kultursensitive Sortierungen durch. Das Sortieren und Nachschlagen in einer SortedList kann durch Thread.CurrentCulture beeinflusst werden; wenn Zeichenfolgen als Schlüssel verwendet werden. Befolgen Sie die in diesem Abschnitt angegebenen Verwendungsempfehlungen, um kulturunempfindliche Ergebnisse aus diesen Klassen und Methoden im Collections Namespace zu erhalten.

Hinweis

Das Übergeben CultureInfo.InvariantCulture an eine Vergleichsmethode führt einen Kultur-insensitiven Vergleich durch. Es verursacht jedoch keinen nicht sprachlichen Vergleich, z. B. für Dateipfade, Registrierungsschlüssel und Umgebungsvariablen. Es unterstützt auch keine Sicherheitsentscheidungen, die auf dem Vergleichsergebnis basieren. Für einen nicht sprachlichen Vergleich oder eine Unterstützung für ergebnisbasierte Sicherheitsentscheidungen sollte die Anwendung eine Vergleichsmethode verwenden, die einen StringComparison Wert akzeptiert. Die Anwendung sollte dann StringComparison übergeben.

Verwenden Sie die Klassen CaseInsensitiveComparer und CaseInsensitiveHashCodeProvider

Die parameterlosen Konstruktoren für CaseInsensitiveHashCodeProvider und CaseInsensitiveComparer initialisieren eine neue Instanz der Klasse unter Verwendung des Thread.CurrentCulture und führen zu kultursensitivem Verhalten. Im folgenden Codebeispiel wird ein kultursensibler Konstruktor für Hashtable dargestellt, da er die parameterlosen Konstruktoren für CaseInsensitiveHashCodeProvider und CaseInsensitiveComparer verwendet.

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

Wenn Sie eine kulturunempfindliche Hashtable mithilfe der 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, definieren Sie CultureInfo.InvariantCulture. 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. Allerdings sind alle Überladungen der CollectionsUtil.CreateCaseInsensitiveHashTable Methode kulturempfindlich, da sie die Thread.CurrentCulture Eigenschaft verwenden. Sie können mit dieser Methode kein kulturunempfindliches Hashtable erstellen. Um eine kulturunempfindliche Hashtable zu erstellen, verwenden Sie den Hashtable-Konstruktor, der einen culture-Parameter akzeptiert. Für den culture Parameter, definieren Sie CultureInfo.InvariantCulture. 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 Sie die SortedList-Klasse

A SortedList stellt eine Auflistung von Schlüssel- und Wertpaaren dar, die nach den Schlüsseln sortiert sind und nach Schlüsseln und nach Index zugänglich sind. Wenn Sie eine SortedList Stelle verwenden, an der Zeichenfolgen die Schlüssel sind, kann die Sortierung und suche von der Thread.CurrentCulture Eigenschaft beeinflusst werden. Um ein kulturunabhängiges Verhalten von einem SortedList zu erzielen, erstellen Sie ein SortedList mithilfe eines der Konstruktoren, die einen comparer Parameter akzeptieren. Der comparer Parameter gibt die Implementierung IComparer vor, die beim Vergleichen von Schlüsseln verwendet werden soll. Geben Sie für den Parameter eine benutzerdefinierte Vergleichsklasse an, die zum Vergleichen von Schlüsseln verwendet wird CultureInfo.InvariantCulture . Das folgende Beispiel veranschaulicht eine benutzerdefinierte kulturunabhängige Vergleichsklasse, 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 kultursensitive Sortierungen standardmäßig mithilfe der Thread.CurrentCulture Eigenschaft aus. Die Ergebnisse können aufgrund unterschiedlicher Sortierreihenfolgen je nach Kultur 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 Vergleichsklasse an, die CultureInfo.InvariantCulture verwendet. Ein Beispiel für eine benutzerdefinierte invariante Vergleichsklasse wird im Thema "Using the SortedList Class " bereitgestellt.

Siehe auch