Durchführen kulturunabhängiger Zeichenfolgenoperationen in Auflistungen

Der System.Collections-Namespace enthält Klassen und Member, die als Standardeinstellung ein kulturabhängiges Verhalten bereitstellen. Die Standardkonstruktoren für die CaseInsensitiveComparer-Klasse und die CaseInsensitiveHashCodeProvider-Klasse initialisieren eine neue Instanz mit der Thread.CurrentCulture-Eigenschaft. Alle Überladungen der CollectionsUtil.CreateCaseInsensitiveHashTable-Methode erstellen eine neue Instanz der Hashtable-Klasse und verwenden dabei als Standardeinstellung die Thread.CurrentCulture-Eigenschaft. Überladungen der ArrayList.Sort-Methode führen als Standardeinstellung kulturabhängige Sortierungen mithilfe von Thread.CurrentCulture durch. Das Sortieren und Suchen in einer SortedList kann durch Thread.CurrentCulture beeinflusst werden, wenn Zeichenfolgen als Schlüssel verwendet werden. Befolgen Sie die Verwendungsempfehlungen in diesem Abschnitt, um aus diesen Klassen und Methoden im Collections-Namespace kulturunabhängige Ergebnisse abzurufen.

Verwenden der CaseInsensitiveComparer-Klasse und der CaseInsensitiveHashCodeProvider-Klasse

Die Standardkonstruktoren für CaseInsensitiveHashCodeProvider und CaseInsensitiveComparer initialisieren eine neue Instanz der Klasse mithilfe der Thread.CurrentCulture. Dies führt zu kulturabhängigem Verhalten. Im folgenden Codebeispiel wird der Konstruktor für eine Hashtable dargestellt, die kulturabhängig ist, weil die Standardkonstruktoren für CaseInsensitiveHashCodeProvider und CaseInsensitiveComparer verwendet werden.

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

Wenn Sie mithilfe der CaseInsensitiveComparer-Klasse und der CaseInsensitiveHashCodeProvider-Klasse eine kulturunabhängige Hashtable erstellen möchten, müssen Sie neue Instanzen dieser Klassen initialisieren und dabei Konstruktoren verwenden, die einen culture-Parameter akzeptieren. Geben Sie CultureInfo.InvariantCulture für den culture-Parameter an. Im folgenden Codebeispiel wird der Konstruktor für eine kulturunabhängige Hashtable dargestellt.

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 eignet sich sehr gut zum schnellen Erstellen einer neuen Instanz der Hashtable-Klasse, die die Groß-/Kleinschreibung von Zeichenfolgen außer Acht lässt. Sämtliche Überladungen der CollectionsUtil.CreateCaseInsensitiveHashTable-Methode sind jedoch kulturabhängig, da sie die Thread.CurrentCulture-Eigenschaft verwenden. Mithilfe dieser Methode kann keine kulturunabhängige Hashtable erstellt werden. Verwenden Sie zum Erstellen einer kulturunabhängigen Hashtable einen Hashtable-Konstruktor, der einen culture-Parameter akzeptiert. Geben Sie CultureInfo.InvariantCulture für den culture-Parameter an. Im folgenden Codebeispiel wird der Konstruktor für eine kulturunabhängige Hashtable dargestellt.

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

SortedList stellt eine Auflistung von Schlüssel-Wert-Paaren dar, die nach den Schlüsseln sortiert sind und auf die sowohl über Schlüssel als auch über Indizes zugegriffen werden kann. Wenn Sie eine SortedList verwenden, bei der Zeichenfolgen als Schlüssel fungieren, können Sortier- und Suchvorgänge durch die Thread.CurrentCulture-Eigenschaft beeinflusst werden. Um ein kulturunabhängiges Verhalten bei einer SortedList zu erzielen, erstellen Sie eine SortedList mithilfe eines Konstruktors, der einen Comparer-Parameter akzeptiert. Der Comparer-Parameter gibt die IComparer-Implementierung an, die beim Vergleichen von Schlüsseln verwendet wird. Geben Sie für den IComparer-Parameter eine benutzerdefinierte Comparer-Klasse an, die die Schlüssel mithilfe von CultureInfo.InvariantCulture vergleicht. Das folgende Beispiel veranschaulicht eine benutzerdefinierte, kulturunabhängige Comparer-Klasse, die als IComparer-Parameter für einen SortedList-Konstruktor angegeben werden kann.

Imports System
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 m_compareInfo;
    internal static readonly InvariantComparer Default = new
        InvariantComparer();

    internal InvariantComparer() 
    {
        m_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }
    
    public int Compare(Object a, Object b)
    {
        String sa = a as String;
        String sb = b as String;
        if (sa != null && sb != null)
            return m_compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

Wenn Sie eine SortedList für Zeichenfolgen ohne Angabe eines benutzerdefinierten, invarianten Comparers verwenden, kann eine Änderung von Thread.CurrentCulture nach dem Auffüllen der Liste dazu führen, dass die Liste ungültig wird.

Verwenden der ArrayList.Sort-Methode

Überladungen der ArrayList.Sort-Methode führen als Standardeinstellung kulturabhängige Sortierungen mithilfe der Thread.CurrentCulture-Eigenschaft durch. Die Ergebnisse können je nach Kultur aufgrund der unterschiedlichen Sortierreihenfolgen variieren. Verwenden Sie zum Beseitigen des kulturabhängigen Verhaltens die Überladungen dieser Methode, die einen IComparer-Parameter akzeptieren. Geben Sie für den IComparer-Parameter eine benutzerdefinierte, invariante Comparer-Klasse an, die CultureInfo.InvariantCulture verwendet. Ein Beispiel für eine benutzerdefinierte, invariante Comparer-Klasse finden Sie unter Verwenden der SortedList-Klasse.

Siehe auch

Referenz

CaseInsensitiveComparer Class
CaseInsensitiveHashCodeProvider Class
CollectionsUtil.CreateCaseInsensitiveHashTable Method
ArrayList.Sort Method
SortedList Class
Hashtable Class
IComparer Interface

Weitere Ressourcen

Durchführen kulturunabhängiger Zeichenfolgenoperationen