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.CurrentCultureklasy , 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 Hashtablena 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 Hashtablena 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 Hashtablena 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.InvariantCultureklasy . Przykład niestandardowej niezmiennej klasy porównującej znajduje się w temacie Using the SortedList Class (Używanie klasy SortedList).

Zobacz też