C# — Não normalize strings para compará-las

Elvis Fernandes Dias
2 min readOct 26, 2021

--

É 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 :)

--

--

Elvis Fernandes Dias

.Net Developer Graduado em Ciência da Computação e Pós Graduado em Engenharia de Software