Partilhar via


Executar operações de cadeia de caracteres insensíveis à cultura em coleções

Há classes e membros no namespace que fornecem comportamento sensível à System.Collections cultura por padrão. Os construtores sem parâmetros para as classes e CaseInsensitiveHashCodeProvider inicializam CaseInsensitiveComparer uma nova instância usando a Thread.CurrentCulture propriedade. Todas as sobrecargas do CollectionsUtil.CreateCaseInsensitiveHashtable método criam uma nova instância da Hashtable classe usando a Thread.CurrentCulture propriedade por padrão. Sobrecargas do método executam classificações sensíveis à ArrayList.Sort cultura por padrão usando Thread.CurrentCulture. A classificação e a pesquisa em um SortedList podem ser afetadas por Thread.CurrentCulture quando as cadeias de caracteres são usadas como as chaves. Siga as recomendações de uso fornecidas nesta seção para obter resultados que não diferenciam a cultura dessas classes e métodos no Collections namespace.

Nota

Passar CultureInfo.InvariantCulture para um método de comparação executa uma comparação insensível à cultura. No entanto, ele não causa uma comparação não linguística, por exemplo, para caminhos de arquivo, chaves do Registro e variáveis de ambiente. Também não suporta decisões de segurança baseadas no resultado da comparação. Para uma comparação não linguística ou suporte para decisões de segurança baseadas em resultados, o aplicativo deve usar um método de comparação que aceite um StringComparison valor. O pedido deve então ser aprovado StringComparison.

Use as CaseInsensitiveComparer classes e CaseInsensitiveHashCodeProvider

Os construtores sem parâmetros para CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer inicializam uma nova instância da classe usando o , resultando em comportamento sensível à Thread.CurrentCulturecultura. O exemplo de código a seguir demonstra o construtor para um Hashtable que é sensível à cultura porque ele usa os construtores sem parâmetros para CaseInsensitiveHashCodeProvider e CaseInsensitiveComparer.

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

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

Use o CollectionsUtil.CreateCaseInsensitiveHashTable método

O CollectionsUtil.CreateCaseInsensitiveHashTable método é um atalho útil para criar uma nova instância da Hashtable classe que ignora o caso de cadeias de caracteres. No entanto, todas as sobrecargas do método são sensíveis à CollectionsUtil.CreateCaseInsensitiveHashTable cultura porque usam a Thread.CurrentCulture propriedade. Não é possível criar uma cultura insensível Hashtable usando esse método. Para criar um insensível à Hashtablecultura , 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 um 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));

Use a SortedList classe

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

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

Em geral, se você usar um SortedList on strings sem especificar um comparador invariante personalizado, uma alteração para Thread.CurrentCulture depois que a lista tiver sido preenchida pode invalidar a lista.

Use o ArrayList.Sort método

Sobrecargas do método executam classificações sensíveis à ArrayList.Sort cultura por padrão usando a Thread.CurrentCulture propriedade. Os resultados podem variar de acordo com a cultura devido a diferentes ordens de classificação. Para eliminar o comportamento sensível à cultura, use as sobrecargas desse método que aceitam uma IComparer implementação. Para o comparer parâmetro, especifique uma classe de comparação invariante personalizada que use CultureInfo.InvariantCulture. Um exemplo de uma classe de comparação invariante personalizada é fornecido no tópico Usando a classe SortedList.

Consulte também