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
?
.net
vb.net
localization
Dave Haynes
fonte
fonte
Respostas:
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 usar seqüências de caracteres no Microsoft .NET 2.0 "
fonte
"Straße"
e"STRASSE"
. Ao usarOrdinalIgnoreCase
osEquals
retornosfalse
, considerandoInvariantCultureIgnoreCase
que eles são iguais.Tudo depende
Comparar strings unicode é difícil:
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 deOrdinalIgnoreCase
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.
fonte
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.
fonte
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.
fonte
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 ()?
fonte