Classe SortKey

Este artigo fornece observações complementares à documentação de referência para essa API.

Uma comparação sensível à cultura de duas cadeias de caracteres depende de cada caractere nas cadeias de caracteres com várias categorias de pesos de classificação, incluindo pesos de script, alfabéticos, maiúsculas e minúsculas e diacríticos. Uma chave de classificação serve como repositório desses pesos para uma cadeia de caracteres específica.

O método CompareInfo.GetSortKey retorna uma instância da classe SortKey que reflete o mapeamento sensível à cultura de caracteres em uma cadeia de caracteres especificada. O valor de um objeto SortKey são seus dados de chave, que são retornados pela propriedade KeyData. Esses dados de chave consistem em uma série de bytes que codificam a cadeia de caracteres, regras de classificação específicas da cultura e opções de comparação especificadas pelo usuário. Uma comparação usando chaves de classificação consiste em uma comparação bit a bit dos dados de chave correspondentes em cada chave de classificação. Por exemplo, se você criar uma chave de classificação chamando o método GetSortKey(String, CompareOptions) com um valor de CompareOptions.IgnoreCase, uma operação de comparação de cadeia de caracteres que usa a chave de classificação não diferencia maiúsculas de minúsculas.

Depois de criar uma chave de classificação para uma cadeia de caracteres, você compara chaves de classificação chamando o método estático SortKey.Compare. Esse método executa uma comparação byte a byte simples, portanto, é muito mais rápido do que o método String.Compare ou CompareInfo.Compare.

Observação

Você pode baixar as Tabelas de peso de classificação, um conjunto de arquivos de texto que contêm informações sobre os pesos de caracteres usados em operações de classificação e comparação dos sistemas operacionais Windows, a Tabela de elemento de ordenação Unicode padrão, a tabela de peso de classificação para Linux e macOS.

Considerações sobre o desempenho

Ao executar uma comparação de cadeia de caracteres, os métodos Compare e CompareInfo.Compare produzem os mesmos resultados, mas visam cenários diferentes.

Em um nível alto, o método CompareInfo.Compare gera a chave de classificação para cada cadeia de caracteres, executa a comparação e, em seguida, descarta a chave de classificação e retorna o resultado da comparação. No entanto, o método CompareInfo.Compare realmente não gera uma chave de classificação inteira para executar a comparação. Em vez disso, o método gera os dados de chave para cada elemento de texto (ou seja, caractere base, par substituto ou sequência de caracteres combinada) em cada cadeia de caracteres. Em seguida, o método compara os dados de chave para os elementos de texto correspondentes. A operação termina assim que o resultado final da comparação é determinado. As informações de chave de classificação são computadas, mas nenhum objeto SortKey é criado. Essa estratégia é econômica em termos de desempenho, se ambas as cadeias de caracteres forem comparadas uma vez, mas se torna cara se as mesmas cadeias de caracteres forem comparadas muitas vezes.

O método Compare requer a geração de um objeto SortKey para cada cadeia de caracteres antes de executar a comparação. Essa estratégia é cara em termos de desempenho para a primeira comparação devido ao tempo e à memória investidos para gerar os objetos SortKey. No entanto, torna-se econômico se as mesmas chaves de classificação forem comparadas muitas vezes.

Por exemplo, suponha que você escreva um aplicativo que pesquise uma tabela de banco de dados para a linha na qual a coluna de índice baseada em cadeia de caracteres corresponde a uma cadeia de caracteres de pesquisa especificada. A tabela contém milhares de linhas, e comparar a cadeia de caracteres de pesquisa com o índice em cada linha levará muito tempo. Portanto, quando o aplicativo armazena uma linha e sua coluna de índice, ele também gera e armazena a chave de classificação para o índice em uma coluna dedicada a melhorar o desempenho da pesquisa. Quando o aplicativo procura uma linha de destino, ele compara a chave de classificação da cadeia de caracteres de pesquisa com a chave de classificação da cadeia de caracteres de índice, em vez de comparar a cadeia de caracteres de pesquisa com a cadeia de caracteres de índice.

Considerações de segurança

O método CompareInfo.GetSortKey(String, CompareOptions) retorna um objeto SortKey com o valor baseado em uma cadeia de caracteres e valor CompareOptions especificados e a cultura associada ao objeto CompareInfo subjacente. Se uma decisão de segurança depender de uma comparação de cadeia de caracteres ou mudança de caso, você deverá usar o método CompareInfo.GetSortKey(String, CompareOptions) da cultura invariável para garantir que o comportamento da operação seja consistente, independentemente das configurações de cultura do sistema operacional.

Use as seguintes etapas para obter uma chave de classificação:

  1. Recupere a cultura invariável da propriedade CultureInfo.InvariantCulture.

  2. Recupere um objeto CompareInfo para a cultura invariável da propriedade CultureInfo.CompareInfo.

  3. Chame o método CompareInfo.GetSortKey(String, CompareOptions) .

Trabalhar com o valor de um objeto SortKey é equivalente a chamar o método Windows LCMapString com o valor LCMAP_SORTKEY especificado. No entanto, para o objeto SortKey, as chaves de classificação para caracteres em inglês precedem as chaves de classificação para caracteres coreanos.

Os objetos SortKey podem ser serializados, mas somente para que possam cruzar objetos AppDomain. Se um aplicativo serializa um SortKey objeto, o aplicativo deve regenerar todas as chaves de classificação quando houver uma nova versão do .NET.

Para obter mais informações sobre chaves de classificação, consulte Unicode Technical Standard #10, "Unicode Collation Algorithm" no site do Unicode Consortium.