Wykonywanie operacji na ciągach bez uwzględniania kultury w kolekcjach
Istnieją klasy i elementy członkowskie w System.Collections przestrzeni nazw, które domyślnie zapewniają zachowanie wrażliwe na kulturę. Konstruktory bez parametrów dla CaseInsensitiveComparer klas i CaseInsensitiveHashCodeProvider inicjują nowe wystąpienie przy użyciu Thread.CurrentCulture właściwości . Wszystkie przeciążenia CollectionsUtil.CreateCaseInsensitiveHashtable metody tworzą nowe wystąpienie Hashtable klasy przy użyciu Thread.CurrentCulture
właściwości domyślnie. Przeciążenia metody domyślnie wykonują sortowanie ArrayList.Sort wrażliwe na kulturę przy użyciu metody Thread.CurrentCulture
. Sortowanie i wyszukiwanie w obiekcie SortedList może mieć wpływ Thread.CurrentCulture
na to, gdy ciągi są używane jako klucze. Postępuj zgodnie z zaleceniami dotyczącymi użycia podanymi w tej sekcji, aby uzyskać wyniki niewrażliwe na kulturę z tych klas i metod w Collections
przestrzeni nazw.
Uwaga
Przekazywanie CultureInfo.InvariantCulture do metody porównania wykonuje porównanie niewrażliwe na kulturę. Nie powoduje to jednak porównania nielingwistycznego, na przykład dla ścieżek plików, kluczy rejestru i zmiennych środowiskowych. Żadna z nich nie obsługuje decyzji dotyczących zabezpieczeń na podstawie wyniku porównania. W przypadku porównania nielingwistycznego lub obsługi decyzji dotyczących zabezpieczeń opartych na wynikach StringComparison aplikacja powinna użyć metody porównania, która akceptuje wartość. Następnie aplikacja powinna przekazać wartość StringComparison.
CaseInsensitiveComparer
Używanie klas i CaseInsensitiveHashCodeProvider
Konstruktory bez parametrów dla CaseInsensitiveHashCodeProvider
klasy i CaseInsensitiveComparer
inicjują nowe wystąpienie klasy przy użyciu Thread.CurrentCulture
klasy , co powoduje zachowanie wrażliwe na kulturę. Poniższy przykład kodu przedstawia konstruktor dla elementu Hashtable
, który jest wrażliwy na kulturę, ponieważ używa konstruktorów bez parametrów dla elementów CaseInsensitiveHashCodeProvider
i CaseInsensitiveComparer
.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Jeśli chcesz utworzyć niewrażliwy Hashtable
na kulturę przy użyciu CaseInsensitiveComparer
klas i CaseInsensitiveHashCodeProvider
, zainicjuj nowe wystąpienia tych klas przy użyciu konstruktorów, które akceptują culture
parametr. Dla parametru culture
określ wartość CultureInfo.InvariantCulture. W poniższym przykładzie kodu pokazano konstruktor dla niewrażliwego Hashtable
na kulturę .
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
CollectionsUtil.CreateCaseInsensitiveHashTable
Korzystanie z metody
Metoda CollectionsUtil.CreateCaseInsensitiveHashTable
jest przydatnym skrótem do tworzenia nowego wystąpienia Hashtable
klasy, które ignoruje wielkość liter ciągów. Jednak wszystkie przeciążenia CollectionsUtil.CreateCaseInsensitiveHashTable
metody są wrażliwe na kulturę, ponieważ używają Thread.CurrentCulture
właściwości . Nie można utworzyć niewrażliwego Hashtable
na kulturę przy użyciu tej metody. Aby utworzyć niewrażliwy Hashtable
na kulturę , użyj Hashtable
konstruktora, który akceptuje culture
parametr. Dla parametru culture
określ wartość CultureInfo.InvariantCulture
. W poniższym przykładzie kodu pokazano konstruktor dla niewrażliwego Hashtable
na kulturę .
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
SortedList
Korzystanie z klasy
Obiekt SortedList
reprezentuje kolekcję par klucz-wartość, które są sortowane według kluczy i są dostępne według klucza i według indeksu. W przypadku używania parametru SortedList
where strings to klucze, sortowanie i wyszukiwanie może mieć wpływ na Thread.CurrentCulture
właściwość . Aby uzyskać zachowanie niewrażliwe na kulturę z klasy SortedList
, utwórz SortedList
obiekt przy użyciu jednego z konstruktorów, który akceptuje comparer
parametr. Parametr comparer
określa implementację IComparer , która ma być używana podczas porównywania kluczy. Dla parametru określ niestandardową klasę porównującą używaną CultureInfo.InvariantCulture
do porównywania kluczy. W poniższym przykładzie przedstawiono niestandardową klasę porównującą bez uwzględniania kultury, którą można określić jako comparer
parametr konstruktora SortedList
.
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);
}
}
Ogólnie rzecz biorąc, jeśli używasz elementu SortedList
w ciągach bez określania niestandardowego niezmiennego porównania, zmiana na Thread.CurrentCulture
po wypełnieniu listy może unieważnić listę.
ArrayList.Sort
Korzystanie z metody
Przeciążenia metody domyślnie wykonują sortowanie ArrayList.Sort
wrażliwe na kulturę Thread.CurrentCulture
przy użyciu właściwości . Wyniki mogą się różnić w zależności od kultury z powodu różnych kolejności sortowania. Aby wyeliminować zachowanie wrażliwe na kulturę, użyj przeciążeń tej metody, które akceptują implementację IComparer
. Dla parametru comparer
określ niestandardową niezmienną klasę porównującą, która używa CultureInfo.InvariantCulture
klasy . Przykład niestandardowej niezmiennej klasy porównującej znajduje się w temacie Using the SortedList Class (Używanie klasy SortedList).