Durchführen kulturunabhängiger Zeichenfolgenoperationen in Auflistungen
Aktualisiert: November 2007
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 mit der Thread.CurrentCulture-Eigenschaft eine neue Instanz. 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 für denculture-Parameter CultureInfo.InvariantCulture 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
CaseInsensitiveHashCodeProvider
CollectionsUtil.CreateCaseInsensitiveHashTable-Methode