A execução de operações de cadeia de caracteres com diferenciação de cultura em coleções

Há classes e membros da System.Collections namespace, que fornecem o comportamento de cultura por padrão. Os construtores padrão para o CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider classes inicializar uma nova instância usando o Thread.CurrentCulture propriedade. Todas as sobrecargas da CollectionsUtil.CreateCaseInsensitiveHashTable método cria uma nova instância da Hashtable classe usando o Thread.CurrentCulture propriedade por padrão. Sobrecargas da ArrayList.Sort método executar classificações de cultura usando padrão Thread.CurrentCulture. Classificação e pesquisa em um SortedList pode ser afetada por Thread.CurrentCulture quando as seqüências de caracteres são usadas como chaves. Siga as recomendações de uso fornecidas nesta seção para obter resultados de diferenciação de cultura dessas classes e métodos do Collections namespace.

Notapassando CultureInfo.InvariantCulture para uma comparação entre o método execute uma comparação de diferenciação de cultura. No entanto, ele não causa uma comparação lingüística, por exemplo, para caminhos de arquivos, chaves do registro e variáveis de ambiente. Nem oferece suporte a decisões de segurança com base no resultado da comparação. Para uma comparação lingüística ou suporte a decisões de segurança com base no resultado, o aplicativo deve usar um método de comparação que aceita um StringComparison valor. Em seguida, em que o aplicativo deve passar Ordinal.

Usando o CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider Classes

Os construtores padrão para CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer inicializar uma nova instância da classe usando o Thread.CurrentCulture, resultando em um comportamento de cultura. O exemplo de código a seguir demonstra o construtor para uma Hashtable que é a cultura porque ela usa os construtores padrão para CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer.

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

Se você deseja criar uma cultura diferenciação Hashtableusando o CaseInsensitiveComparer e CaseInsensitiveHashCodeProvider classes, inicializar novas instâncias dessas classes com construtores de aceitam um culture parâmetro. Para o culture parâmetro, especifique CultureInfo.InvariantCulture. O exemplo de código a seguir demonstra o construtor para uma cultura diferenciação Hashtable.

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

Usando o método CollectionsUtil.CreateCaseInsensitiveHashTable

O CollectionsUtil.CreateCaseInsensitiveHashTable método é um atalho úteis para criar uma nova instância da Hashtable classe, que ignora o caso de seqüências de caracteres. No entanto, todas as sobrecargas da CollectionsUtil.CreateCaseInsensitiveHashTable método são sensíveis à cultura, porque eles usam a Thread.CurrentCulture propriedade. Não é possível criar uma cultura diferenciação Hashtable usando este método. Para criar uma cultura diferenciação Hashtable, use o Hashtable construtor que aceita um culture parâmetro. Para o culture parâmetro, especifique CultureInfo.InvariantCulture. O exemplo de código a seguir demonstra o construtor para uma cultura diferenciação Hashtable.

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

Usando a classe SortedList

A SortedList representa uma coleção de pares de chave e valor que são classificados por chaves e são acessíveis por chave e por índice. Quando você usa um SortedList onde as seqüências são as chaves, a classificação e a pesquisa podem ser afetadas pela Thread.CurrentCulture propriedade. Para obter o comportamento de diferenciação de cultura de um SortedList, criar um SortedList usando um dos construtores que aceita um comparer parâmetro. O comparer parâmetro especifica a IComparer a implementação para usar ao comparar chaves. Para o parâmetro, especifique uma classe de comparador personalizado que usa CultureInfo.InvariantCulture para comparar chaves. O exemplo a seguir ilustra uma classe de diferenciação de cultura de comparador personalizado que você pode especificar como o comparer parâmetro para um SortedList construtor.

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 um SortedList em cadeias de caracteres sem especificar um comparador invariável personalizado, uma alteração de Thread.CurrentCulture depois que a lista foi preenchida pode invalidar a lista.

Usando o método ArrayList.Sort

Sobrecargas da ArrayList.Sort método executar classificações de cultura, padrão usando o Thread.CurrentCulture propriedade. Os resultados podem variar por cultura devido a diferentes ordens de classificação. Para eliminar o comportamento de cultura, use as sobrecargas desse método que aceitam um IComparer de implementação. Para o comparer parâmetro, especifique uma classe de comparador invariável personalizado que usa CultureInfo.InvariantCulture. Um exemplo de uma classe personalizada comparador invariável é fornecido no usando a classe SortedList tópico.

Consulte também

Referência

CaseInsensitiveComparer

CaseInsensitiveHashCodeProvider

Método de CollectionsUtil.CreateCaseInsensitiveHashTable

ArrayList.Sort

SortedList

Hashtable

IComparer

Outros recursos

Executar operações de cadeia de caracteres com diferenciação de cultura