Qual geralmente é melhor usar - StringComparison.OrdinalIgnoreCase ou StringComparison.InvariantCultureIgnoreCase?

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho um código como este:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

Eu não me importo com o caso.Devo usar OrdinalIgnoreCase, InvariantCultureIgnoreCase, ou CurrentCultureIgnoreCase?

Foi útil?

Solução

O .Net Docs mais recente agora tem uma tabela para ajudá-lo a decidir qual é o melhor para usar em sua situação.

Do MSDN "Novas recomendações para uso de strings no Microsoft .NET 2.0"

Resumo:Proprietários de código que usavam anteriormente o InvariantCulture para comparação de strings, capitalização e classificação, deve-se considerar fortemente o uso de um novo conjunto de String sobrecargas no Microsoft .NET 2.0. Especificamente, dados projetados para serem independentes da cultura e lingüisticamente irrelevantes deve começar a especificar sobrecargas usando o StringComparison.Ordinal ou StringComparison.OrdinalIgnoreCase membros do novo StringComparison enumeração.Eles impõem uma comparação byte por byte semelhante a strcmp isso não apenas evita erros de interpretação linguística de strings essencialmente simbólicas, mas também proporciona melhor desempenho.

Outras dicas

Tudo depende

Comparar strings Unicode é difícil:

A implementação de pesquisas e comparações de string unicode no software de processamento de texto deve levar em consideração a presença de pontos de código equivalentes.Na ausência desse recurso, os usuários que procuram uma sequência de pontos de código específicos não poderiam encontrar outros glifos visualmente indistinguíveis que tenham uma representação de ponto de código diferente, mas canonicamente equivalente.

ver: http://en.wikipedia.org/wiki/Unicode_equivalence


Se você está tentando comparar 2 strings Unicode sem distinção entre maiúsculas e minúsculas e deseja que funcione EM TODOS OS LUGARES, você tem um problema impossível.

O exemplo clássico é o Turco eu, que quando maiúsculo se torna İ (observe o ponto)

Por padrão, o framework .Net geralmente usa o Cultura Atual para funções relacionadas a strings, com uma exceção muito importante de .Equals que usa uma comparação ordinal (byte por byte).

Isso faz com que, por definição, as diversas funções de string se comportem de maneira diferente, dependendo da cultura do computador.


No entanto, às vezes queremos uma comparação de "propósito geral", sem distinção entre maiúsculas e minúsculas.

Por exemplo, você pode querer que sua comparação de strings se comporte da mesma maneira, independentemente do computador em que seu aplicativo está instalado.

Para conseguir isso temos 3 opções:

  1. Defina a cultura explicitamente e execute uma comparação sem distinção entre maiúsculas e minúsculas usando regras de equivalência unicode.
  2. Defina a cultura como Cultura Invariável e execute a comparação sem distinção entre maiúsculas e minúsculas usando regras de equivalência Unicode.
  3. Usar OrdinalIgnoreCase que colocará a string em maiúscula usando InvariantCulture e, em seguida, executará uma comparação byte por byte.

As regras de equivalência Unicode são complicadas, o que significa que usar o método 1) ou 2) é mais caro do que OrdinalIgnoreCase.O fato de que OrdinalIgnoreCase não executa nenhuma normalização unicode especial, significa que algumas strings são renderizadas da mesma maneira na tela do computador, não vou ser considerado idêntico.Por exemplo: "\u0061\u030a" e "\u00e5" ambos renderizam å.Porém em uma comparação ordinal será considerado diferente.

A escolha depende muito do aplicativo que você está construindo.

  • Se eu estivesse escrevendo um aplicativo de linha de negócios usado apenas por usuários turcos, certamente usaria o método 1.
  • Se eu precisasse apenas de uma comparação simples "falsa" sem distinção entre maiúsculas e minúsculas, por exemplo, um nome de coluna em um banco de dados, que geralmente é inglês, provavelmente usaria o método 3.

A Microsoft tem seu conjunto de recomendações com diretrizes explícitas.No entanto, é realmente importante compreender a noção de equivalência Unicode antes de abordar estes problemas.

Além disso, lembre-se de que OrdinalIgnoreCase é um tipo muito especial de besta, que é escolher um pouco de um ordinal em comparação com alguns mistos em aspectos lexicográficos.Isso pode ser confuso.

O MSDN faz algumas recomendações bastante claras sobre isso: http://msdn.microsoft.com/en-us/library/ms973919.aspx

Acho que depende da sua situação.Como as comparações ordinais analisam, na verdade, os valores numéricos Unicode dos caracteres, elas não serão a melhor escolha ao classificar em ordem alfabética.Para comparações de strings, porém, ordinal seria um pouco mais rápido.

Depende do que você quer, embora eu evite a cultura invariável, a menos que você esteja muito certeza de que você nunca desejará localizar o código para outros idiomas.Use CurrentCulture.

Além disso, OrdinalIgnoreCase deve respeitar os números, que podem ou não ser o que você deseja.

A resposta muito simples é: a menos que você esteja usando turco, não precisa usar InvariantCulture.

Veja o seguinte link:

Em C# qual é a diferença entre ToUpper() e ToUpperInvariant()?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top