C# — Não normalize strings para compará-las
É muito comum termos a necessidade de compararmos strings em nossas implementações, mais comum ainda é precisarmos realizar a comparação como “case-insensitive”, na qual não devemos considerar letras maiúsculas e minúsculas.
A solução que vejo com maior frequência para compararmos strings “case-insensitive” se assemelha com o código abaixo.
Como podemos ver acima, foi utilizado o método “ToUpper” para a normalização das strings e depois é realizada a comparação. Também poderíamos utilizar o “ToLower”.
Isso funciona? Funciona. Mas será que tem algum impacto negativo? Sim.
Strings são objetos imutáveis, ou seja, quando utilizamos o método “ToUpper” uma nova string é criada, e somente depois dessa criação a comparação é realizada. Desta forma mais operações são realizadas e também temos aumento no consumo de memória.
No cenário que precisamos comparar strings ignorando o “case”, podemos realizar a comparação conforme o código abaixo:
Com a implementação acima não são criadas novas strings. Mas será que essa alteração nos traz algum ganho? Vamos ver a comparação abaixo.
O primeiro resultado da grid corresponde a função onde normalizamos a string com ToUpper, e segundo a função que utilizamos o método “Equals” indicando para não considerar o case na comparação. Como podemos observar, neste cenário, a comparação utilizando Equals é quase 10 vezes mais rápida e outra vantagem é que não ocorreu execução do GC (Garbage collector), podemos observar isso na coluna “Gen 0".
Podemos ver outras dicas sobre comparação de strings no artigo abaixo da Microsoft.
O artigo foi simples, mas espero que seja útil.
Obrigado e até a próxima :)