Executando operações de cadeia de caracteres que não levam em conta a cultura em coleçõesPerforming Culture-Insensitive String Operations in Collections

Há classes e membros no namespace System.Collections que fornecem, por padrão, o comportamento sensível à cultura.There are classes and members in the System.Collections namespace that provide culture-sensitive behavior by default. Os construtores sem parâmetros para as classes CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider inicializam uma nova instância usando a propriedade Thread.CurrentCulture.The parameterless constructors for the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes initialize a new instance using the Thread.CurrentCulture property. Todas as sobrecargas do método CollectionsUtil.CreateCaseInsensitiveHashtable criam uma nova instância da classe Hashtable usando a propriedade Thread.CurrentCulture por padrão.All overloads of the CollectionsUtil.CreateCaseInsensitiveHashtable method create a new instance of the Hashtable class using the Thread.CurrentCulture property by default. As sobrecargas do método ArrayList.Sort executam, por padrão, classificações sensíveis à cultura usando Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using Thread.CurrentCulture. A classificação e a pesquisa em uma SortedList podem ser afetadas por Thread.CurrentCulture, quando as cadeias de caracteres são usadas como as chaves.Sorting and lookup in a SortedList can be affected by Thread.CurrentCulture when strings are used as the keys. Siga as recomendações de uso fornecidas nesta seção para obter os resultados insensíveis à cultura dessas classes e métodos no namespace Collections.Follow the usage recommendations provided in this section to obtain culture-insensitive results from these classes and methods in the Collections namespace.

Observação Passar CultureInfo.InvariantCulture para um método de comparação gera uma comparação insensível à cultura.Note Passing CultureInfo.InvariantCulture to a comparison method does perform a culture-insensitive comparison. No entanto, não causa uma comparação não linguística, por exemplo, para caminhos de arquivos, chaves do Registro e variáveis de ambiente.However, it does not cause a non-linguistic comparison, for example, for file paths, registry keys, and environment variables. Também não oferece suporte a decisões de segurança com base no resultado da comparação.Neither does it support security decisions based on the comparison result. Para obter uma comparação não linguística ou suporte para decisões de segurança com base no resultado, o aplicativo deve usar um método de comparação que aceite um valor 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. Assim, o aplicativo deve passar StringComparison.The application should then pass StringComparison.

Usar as classes CaseInsensitiveHashCodeProvider e CaseInsensitiveComparerUsing the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider Classes

Os construtores sem parâmetros CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer inicializam uma nova instância da classe usando o Thread.CurrentCulture, resultando no comportamento sensível à cultura.The parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer initialize a new instance of the class using the Thread.CurrentCulture, resulting in culture-sensitive behavior. O exemplo de código a seguir demonstra o construtor para um Hashtable que é sensível à cultura, pois usa os construtores sem parâmetros para CaseInsensitiveHashCodeProvider e 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);  

Se você quiser criar um Hashtable insensível à cultura usando as classes CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider, inicialize novas instâncias dessas classes usando os construtores que aceitam um parâmetro 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. Para o parâmetro culture, especifique CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. O exemplo de código a seguir demonstra o construtor para um Hashtable insensível à cultura.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));  

Usar o método CollectionsUtil.CreateCaseInsensitiveHashTableUsing the CollectionsUtil.CreateCaseInsensitiveHashTable Method

O método CollectionsUtil.CreateCaseInsensitiveHashTable é um atalho útil para criar uma nova instância da classe Hashtable que não diferencia maiúsculas de minúsculas das cadeias de caractere.The CollectionsUtil.CreateCaseInsensitiveHashTable method is a useful shortcut for creating a new instance of the Hashtable class that ignores the case of strings. No entanto, todas as sobrecargas do método CollectionsUtil.CreateCaseInsensitiveHashTable são sensíveis à cultura, pois usam a propriedade Thread.CurrentCulture.However, all overloads of the CollectionsUtil.CreateCaseInsensitiveHashTable method are culture-sensitive because they use the Thread.CurrentCulture property. Não é possível criar um Hashtable insensível à cultura usando esse método.You cannot create a culture-insensitive Hashtable using this method. Para criar um Hashtable insensível à cultura, use o construtor Hashtable que aceita um parâmetro culture.To create a culture-insensitive Hashtable, use the Hashtable constructor that accepts a culture parameter. Para o parâmetro culture, especifique CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. O exemplo de código a seguir demonstra o construtor para um Hashtable insensível à cultura.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));  

Usar a classe SortedListUsing the SortedList Class

Um SortedList representa uma coleção de pares chave/valor que são classificados pelas chaves e são acessíveis por chave e por índice.A SortedList represents a collection of key-and-value pairs that are sorted by the keys and are accessible by key and by index. Quando você usa um SortedList no qual as cadeias de caracteres são as chaves, a classificação e a pesquisa podem ser afetadas pela propriedade Thread.CurrentCulture.When you use a SortedList where strings are the keys, the sorting and lookup can be affected by the Thread.CurrentCulture property. Para obter o comportamento insensível à cultura de um SortedList, crie um SortedList usando um dos construtores que aceita um parâmetro comparer.To obtain culture-insensitive behavior from a SortedList, create a SortedList using one of the constructors that accepts a comparer parameter. O parâmetro comparer especifica a implementação de IComparer a ser usada ao comparar chaves.The comparer parameter specifies the IComparer implementation to use when comparing keys. Para o parâmetro, especifique uma classe de comparação personalizada que usa CultureInfo.InvariantCulture para comparar as chaves.For the parameter, specify a custom comparer class that uses CultureInfo.InvariantCulture to compare keys. O exemplo a seguir ilustra uma classe de comparação personalizada insensível à cultura que você pode especificar como o parâmetro comparer para um construtor 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  
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);  
    }  
}  

Em geral, se você usar SortedList em cadeias de caracteres sem especificar um comparador personalizado invariável, uma alteração em Thread.CurrentCulture após o preenchimento da lista poderá invalidar a lista.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.

Usar o método ArrayList.SortUsing the ArrayList.Sort Method

Sobrecargas do método ArrayList.Sort executam, por padrão, classificações sensíveis à cultura usando a propriedade Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using the Thread.CurrentCulture property. Os resultados podem variar de acordo com a cultura, devido a ordens de classificação diferentes.Results can vary by culture due to different sort orders. Para eliminar o comportamento sensível à cultura, use as sobrecargas desse método para aceitar uma implementação IComparer.To eliminate culture-sensitive behavior, use the overloads of this method that accept an IComparer implementation. Para o parâmetro comparer, especifique uma classe de comparação invariável personalizada que usa CultureInfo.InvariantCulture.For the comparer parameter, specify a custom invariant comparer class that uses CultureInfo.InvariantCulture. Um exemplo de uma classe de comparação invariável personalizada é fornecido no tópico Usar a classe SortedList.An example of a custom invariant comparer class is provided in the Using the SortedList Class topic.

Consulte tambémSee also