Wykonywanie niezależnych od kultury operacji na ciągach w kolekcjachPerforming Culture-Insensitive String Operations in Collections

W przestrzeni nazw System.Collections znajdują się klasy i elementy członkowskie, które domyślnie udostępniają zachowania zależne od kultury.There are classes and members in the System.Collections namespace that provide culture-sensitive behavior by default. Konstruktory bez parametrów dla klas CaseInsensitiveComparer i CaseInsensitiveHashCodeProvider inicjują nowe wystąpienie przy użyciu właściwości Thread.CurrentCulture.The parameterless constructors for the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes initialize a new instance using the Thread.CurrentCulture property. Wszystkie przeciążenia metody CollectionsUtil.CreateCaseInsensitiveHashtable tworzą nowe wystąpienie klasy Hashtable domyślnie przy użyciu właściwości Thread.CurrentCulture.All overloads of the CollectionsUtil.CreateCaseInsensitiveHashtable method create a new instance of the Hashtable class using the Thread.CurrentCulture property by default. Przeciążenia metody ArrayList.Sort są wykonywane domyślnie przez Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using Thread.CurrentCulture. Thread.CurrentCulture, gdy ciągi są używane jako klucze, można mieć wpływ na sortowanie i wyszukiwanie w SortedList.Sorting and lookup in a SortedList can be affected by Thread.CurrentCulture when strings are used as the keys. Postępuj zgodnie z zaleceniami dotyczącymi użycia opisanymi w tej sekcji, aby uzyskać wyniki niewrażliwe na kulturę z tych klas i metod w przestrzeni nazw Collections.Follow the usage recommendations provided in this section to obtain culture-insensitive results from these classes and methods in the Collections namespace.

Uwaga

Przekazywanie CultureInfo.InvariantCulture do metody porównania wykonuje porównanie nieuwzględniające kulturę.Passing CultureInfo.InvariantCulture to a comparison method does perform a culture-insensitive comparison. Nie powoduje to jednak porównania w języku innym niż język, na przykład w przypadku ścieżek plików, kluczy rejestru i zmiennych środowiskowych.However, it does not cause a non-linguistic comparison, for example, for file paths, registry keys, and environment variables. Żadna z tych funkcji nie wspiera podejmowania decyzji dotyczących zabezpieczeń w oparciu o wynik porównania.Neither does it support security decisions based on the comparison result. W przypadku niezgodności z językiem lub pomocy technicznej dla decyzji o zabezpieczeniach opartych na wynikach aplikacja powinna używać metody porównania, która akceptuje wartość StringComparison.For a non-linguistic comparison or support for result-based security decisions, the application should use a comparison method that accepts a StringComparison value. Aplikacja powinna następnie przekazać StringComparison.The application should then pass StringComparison.

Korzystanie z klas CaseInsensitiveComparer i CaseInsensitiveHashCodeProviderUsing the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider Classes

Konstruktory bez parametrów dla CaseInsensitiveHashCodeProvider i CaseInsensitiveComparer inicjują nowe wystąpienie klasy przy użyciu Thread.CurrentCulture, co wpływa na zachowanie kulturowe.The parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer initialize a new instance of the class using the Thread.CurrentCulture, resulting in culture-sensitive behavior. Poniższy przykład kodu demonstruje konstruktora dla Hashtable, który jest wrażliwy na kulturę, ponieważ używa konstruktorów bez parametrów dla CaseInsensitiveHashCodeProvider i CaseInsensitiveComparer.The following code example demonstrates the constructor for a Hashtable that is culture-sensitive because it uses the parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer.

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

Jeśli chcesz utworzyć Hashtable bez uwzględniania kultur przy użyciu klas CaseInsensitiveComparer i CaseInsensitiveHashCodeProvider, zainicjuj nowe wystąpienia tych klas przy użyciu konstruktorów, które akceptują parametr culture.If you want to create a culture-insensitive Hashtable using the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes, initialize new instances of these classes using the constructors that accept a culture parameter. Dla parametru culture Określ CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. Poniższy przykład kodu demonstruje konstruktora dla Hashtableniewrażliwych na kulturę.The following code example demonstrates the constructor for a culture-insensitive Hashtable.

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

Korzystanie z metody CollectionsUtil. CreateCaseInsensitiveHashTableUsing the CollectionsUtil.CreateCaseInsensitiveHashTable Method

Metoda CollectionsUtil.CreateCaseInsensitiveHashTable jest użytecznym skrótem do tworzenia nowego wystąpienia klasy Hashtable, która ignoruje wielkość liter w ciągach.The CollectionsUtil.CreateCaseInsensitiveHashTable method is a useful shortcut for creating a new instance of the Hashtable class that ignores the case of strings. Jednak wszystkie przeciążenia metody CollectionsUtil.CreateCaseInsensitiveHashTable są zależne od kultury, ponieważ używają właściwości Thread.CurrentCulture.However, all overloads of the CollectionsUtil.CreateCaseInsensitiveHashTable method are culture-sensitive because they use the Thread.CurrentCulture property. Nie można utworzyć Hashtable bez uwzględniania kultur przy użyciu tej metody.You cannot create a culture-insensitive Hashtable using this method. Aby utworzyć Hashtablebez uwzględniania kultur, należy użyć konstruktora Hashtable, który akceptuje parametr culture.To create a culture-insensitive Hashtable, use the Hashtable constructor that accepts a culture parameter. Dla parametru culture Określ CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. Poniższy przykład kodu demonstruje konstruktora dla Hashtableniewrażliwych na kulturę.The following code example demonstrates the constructor for a culture-insensitive Hashtable.

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

Korzystanie z klasy SortedListUsing the SortedList Class

SortedList reprezentuje kolekcję par klucz-wartość, które są sortowane według kluczy i są dostępne dla klucza i według indeksu.A SortedList represents a collection of key-and-value pairs that are sorted by the keys and are accessible by key and by index. W przypadku używania SortedList, w którym ciągi są kluczami, właściwość Thread.CurrentCulture może mieć wpływ na sortowanie i wyszukiwanie.When you use a SortedList where strings are the keys, the sorting and lookup can be affected by the Thread.CurrentCulture property. Aby uzyskać zachowanie niewrażliwe na kulturę z SortedList, Utwórz SortedList przy użyciu jednego z konstruktorów, które akceptują parametr comparer.To obtain culture-insensitive behavior from a SortedList, create a SortedList using one of the constructors that accepts a comparer parameter. comparer parametr określa implementację IComparer do użycia podczas porównywania kluczy.The comparer parameter specifies the IComparer implementation to use when comparing keys. Dla parametru Określ niestandardową klasę porównującą, która używa CultureInfo.InvariantCulture do porównywania kluczy.For the parameter, specify a custom comparer class that uses CultureInfo.InvariantCulture to compare keys. Poniższy przykład ilustruje niestandardową klasę niezależną od kultury, którą można określić jako parametr comparer konstruktora SortedList.The following example illustrates a custom culture-insensitive comparer class that you can specify as the comparer parameter to a SortedList constructor.

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);
    }
}

Ogólnie rzecz biorąc, jeśli używasz SortedList na ciągach bez określenia niestandardowej niezmiennej niezmiennej, zmiana na Thread.CurrentCulture po wypełnieniu listy może unieważnić listę.In general, if you use a SortedList on strings without specifying a custom invariant comparer, a change to Thread.CurrentCulture after the list has been populated can invalidate the list.

Korzystanie z metody ArrayList. SortUsing the ArrayList.Sort Method

Przeciążenia metody ArrayList.Sort wykonują domyślnie sortowanie zależne od kultury przy użyciu właściwości Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using the Thread.CurrentCulture property. Wyniki mogą się różnić w zależności od różnych kolejności sortowania.Results can vary by culture due to different sort orders. Aby wyeliminować zachowanie wrażliwe na kulturę, Użyj przeciążenia tej metody, która akceptuje implementację IComparer.To eliminate culture-sensitive behavior, use the overloads of this method that accept an IComparer implementation. Dla parametru comparer Określ niestandardową klasę niezmiennej porównującej, która używa CultureInfo.InvariantCulture.For the comparer parameter, specify a custom invariant comparer class that uses CultureInfo.InvariantCulture. Przykład niestandardowej klasy niezmiennej porównującej znajduje się w temacie using klasy SortedList .An example of a custom invariant comparer class is provided in the Using the SortedList Class topic.

Zobacz takżeSee also