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.CurrentCulture
cultura. 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 à Hashtable
cultura , 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.