Eu tenho algum código como este:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Eu não ligo para o caso. Devo usar OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
Eu tenho algum código como este:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Eu não ligo para o caso. Devo usar OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
Respostas:
Do MSDN " Novas recomendações para usar seqüências de caracteres no Microsoft .NET 2.0 "
Resumo: Os proprietários de código que usavam anteriormente a
InvariantCulture
comparação, a composição e a classificação de seqüências de caracteres devem considerar o uso de um novo conjunto deString
sobrecargas no Microsoft .NET 2.0. Especificamente, os dados projetados para serem independentes de cultura e linguisticamente irrelevantes devem começar a especificar sobrecargas usando oStringComparison.Ordinal
ou osStringComparison.OrdinalIgnoreCase
membros da novaStringComparison
enumeração. Eles impõem uma comparação de byte a byte semelhantestrcmp
àquela que não apenas evita bugs da interpretação linguística de seqüências essencialmente simbólicas, mas fornece melhor desempenho.
"Straße"
e "STRASSE"
. Ao usar OrdinalIgnoreCase
os Equals
retornos false
, considerando InvariantCultureIgnoreCase
que eles são iguais.
Comparar strings unicode é difícil:
A implementação de pesquisas e comparações de strings 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 pesquisam uma sequência específica de pontos de código não conseguiriam encontrar outros glifos visualmente indistinguíveis que tenham uma representação de ponto de código diferente, mas canonicamente equivalente.
veja: http://en.wikipedia.org/wiki/Unicode_equivalence
Se você está tentando comparar duas cadeias unicode de uma maneira que não diferencia maiúsculas de minúsculas e deseja que funcione EM TODA PARTE , você tem um problema impossível.
O exemplo clássico é o turco i , que quando maiúsculo se torna © (observe o ponto)
Por padrão, a estrutura .Net geralmente usa o CurrentCulture para funções relacionadas a cadeias, com uma exceção muito importante .Equals
que usa uma comparação ordinal (byte a byte).
Isso leva, por design, às várias funções de seqüência de caracteres que se comportam de maneira diferente, dependendo da cultura do computador.
No entanto, às vezes queremos uma comparação "de uso geral", sem distinção entre maiúsculas e minúsculas.
Por exemplo, você pode querer que sua comparação de cadeias se comporte da mesma maneira, não importa em que computador seu aplicativo esteja instalado.
Para conseguir isso, temos 3 opções:
As regras de equivalência Unicode são complicadas, o que significa que o método 1) ou 2) é mais caro que OrdinalIgnoreCase
. O fato de OrdinalIgnoreCase
não executar nenhuma normalização unicode especial significa que algumas seqüências que são renderizadas da mesma maneira na tela do computador não serão consideradas idênticas. Por exemplo: "\u0061\u030a"
e "\u00e5"
ambos renderizam å. No entanto, em uma comparação ordinal será considerado diferente.
A escolha que você escolher depende muito do aplicativo que você está criando.
A Microsoft tem seu conjunto de recomendações com diretrizes explícitas. No entanto, é realmente importante entender a noção de equivalência unicode antes de abordar esses problemas.
Além disso, lembre-se de que OrdinalIgnoreCase é um tipo muito especial de animal, que está escolhendo um pouco de comparação ordinal com alguns misturados em aspectos lexicográficos. Isso pode ser confuso.
Eu acho que depende da sua situação. Como as comparações ordinais estão realmente observando os valores numéricos Unicode dos caracteres, elas não serão a melhor opção quando você estiver classificando em ordem alfabética. Para comparações de strings, ordinal seria um pouco mais rápido.
Depende do que você quer, embora eu coíbe de InvariantCulture menos que você está muito certo de que você nunca mais vai querer localizar o código para outras línguas. 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 é que, a menos que você esteja usando turco, não precisará usar o InvariantCulture.
Veja o seguinte link:
Em C #, qual é a diferença entre ToUpper () e ToUpperInvariant ()?