Comparar string em C # é bastante simples. De fato, existem várias maneiras de fazer isso. Eu listei alguns no bloco abaixo. O que estou curioso são as diferenças entre eles e quando um deve ser usado em relação aos outros? Deve-se evitar a todo custo? Há mais que eu não listei?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(Observação: estou procurando a igualdade neste exemplo, não menos que ou maior que, mas fique à vontade para comentar sobre isso também)
c#
string
comparison
Craig
fonte
fonte
Respostas:
Aqui estão as regras de como essas funções funcionam:
stringValue.CompareTo(otherStringValue)
null
vem antes de uma stringCultureInfo.CurrentCulture.CompareInfo.Compare
, o que significa que usará uma comparação dependente da cultura. Isso pode significar queß
será comparado com igualSS
na Alemanha ou similarstringValue.Equals(otherStringValue)
null
não é considerado igual a nadaStringComparison
opção, ela usará o que parece uma verificação direta de igualdade ordinal, ouß
seja, não é a mesma queSS
em qualquer idioma ou culturastringValue == otherStringValue
stringValue.Equals()
.==
operador chama oEquals(string a, string b)
método estático (que por sua vez vai para um internoEqualsHelper
para fazer a comparação..Equals()
de umanull
sequência obtém umanull
exceção de referência, enquanto a==
ativação não.Object.ReferenceEquals(stringValue, otherStringValue)
Apenas verifica se as referências são iguais, ou seja, não são apenas duas strings com o mesmo conteúdo, você está comparando um objeto string com ele mesmo.
Observe que, com as opções acima que usam chamadas de método, há sobrecargas com mais opções para especificar como comparar.
Meu conselho, se você apenas deseja verificar a igualdade, decide se deseja usar uma comparação dependente da cultura ou não e, em seguida, use
.CompareTo
ou.Equals
, dependendo da escolha.fonte
String.Compare
?Do MSDN:
Eles sugerem o uso em
.Equals
vez de.CompareTo
procurar apenas a igualdade. Não tenho certeza se existe uma diferença entre.Equals
e==
para astring
turma. Às vezes, usarei.Equals
ou emObject.ReferenceEquals
vez de==
para minhas próprias classes, caso alguém apareça mais tarde e redefina o==
operador para essa classe.fonte
Se você estiver curioso sobre as diferenças nos métodos BCL, o Reflector é seu amigo :-)
Eu sigo estas diretrizes:
Correspondência exata: EDIT: Eu sempre usei o operador == com o princípio de que dentro de Equals (string, string) o operador object == é usado para comparar as referências do objeto, mas parece que strA.Equals (strB) ainda é de 1 a 11% geral mais rápido que string.Equals (strA, strB), strA == strB e string.CompareOrdinal (strA, strB). Fiz um loop testado com um StopWatch em valores de sequência internos / não internos, com comprimentos de sequência iguais / diferentes e tamanhos variados (1B a 5MB).
Correspondência legível por humanos (culturas ocidentais, sem distinção entre maiúsculas e minúsculas):
Correspondência legível por humanos (todas as outras culturas, maiúsculas / minúsculas / sotaque / kana / etc definidas por CultureInfo):
Correspondência legível por humanos com regras personalizadas (todas as outras culturas):
fonte
Como Ed disse, o CompareTo é usado para classificação.
Há uma diferença, no entanto, entre .Equals e ==.
== resolve essencialmente o seguinte código:
O motivo simples é o seguinte lançará uma exceção:
E o seguinte não será:
fonte
Boas explicações e práticas sobre problemas de comparação de cadeias podem ser encontradas no artigo Novas recomendações para usar cadeias de caracteres no Microsoft .NET 2.0 e também em Práticas recomendadas para usar cadeias de caracteres no .NET Framework .
Cada um dos métodos mencionados (e outros) tem uma finalidade específica. A principal diferença entre eles é que tipo de enumeração StringComparison eles estão usando por padrão. Existem várias opções:
Cada um dos tipos de comparação acima visa diferentes casos de uso:
Observe que a enumeração StringComparison , bem como sobrecargas para métodos de comparação de strings, existem desde o .NET 2.0.
Método String.CompareTo (String)
De fato, é uma implementação segura do tipo IComparable.CompareTo Method . Interpretação padrão: CurrentCulture.
Uso:
portanto
Método String.Compare
Um membro estático da classe String que possui muitas sobrecargas. Interpretação padrão: CurrentCulture.
Método String.Equals
Substituído da classe Object e sobrecarregado para segurança do tipo. Interpretação padrão: Ordinal. Notar que:
Classe StringComparer
Há também outra maneira de lidar com comparações de strings, especialmente com a classificação:
fonte
Não que o desempenho geralmente importe com 99% das vezes que você precisa fazer isso, mas se você tivesse que fazer isso várias vezes várias vezes, sugiro que você use .Equals ou == porque assim que encontrar um caractere isso não corresponde, lança a coisa toda como falsa, mas se você usar o CompareTo, ele terá que descobrir qual caractere é menor que o outro, levando a um tempo de desempenho um pouco pior.
Se seu aplicativo estiver em execução em diferentes países, recomendamos que você dê uma olhada nas implicações do CultureInfo e, possivelmente, use .Equals. Como eu realmente só escrevo aplicativos para os EUA (e não me importo se ele não funcionar corretamente por alguém), eu sempre uso ==.
fonte
Nos formulários listados aqui, não há muita diferença entre os dois.
CompareTo
acaba chamando umCompareInfo
método que faz uma comparação usando a cultura atual;Equals
é chamado pelo==
operador.Se você considerar sobrecargas, as coisas ficam diferentes.
Compare
e==
só pode usar a cultura atual para comparar uma sequência.Equals
eString.Compare
pode usar umStringComparison
argumento de enumeração que permite especificar comparações sem distinção de cultura ou sem distinção entre maiúsculas e minúsculas.String.Compare
Permite apenas especificarCultureInfo
e realizar comparações usando uma cultura diferente da cultura padrão.Devido à sua versatilidade, acho que uso
String.Compare
mais do que qualquer outro método de comparação; permite especificar exatamente o que eu quero.fonte
Uma grande diferença a ser observada é .Equals () lançará uma exceção se a primeira string for nula, enquanto que == não.
fonte
fonte
Usar .Equals também é muito mais fácil de ler .
fonte
com .Equals, você também obtém as opções StringComparison. muito útil para ignorar caso e outras coisas.
btw, isso será avaliado como falso
Como == compara os valores de aeb (que são ponteiros), isso só será avaliado como verdadeiro se os ponteiros apontarem para o mesmo objeto na memória. .Equals desreferencia os ponteiros e compara os valores armazenados nos ponteiros. a.Equals (b) seria verdade aqui.
e se você alterar b para:
então a.Equals (b) é falso, mas
seria verdade
a.CompareTo (b) chama a função CompareTo da string que compara os valores nos ponteiros e retorna <0 se o valor armazenado em a for menor que o valor armazenado em b, retorna 0 se a.Equals (b) for verdadeiro e > 0 caso contrário. No entanto, isso faz distinção entre maiúsculas e minúsculas, acho que existem opções para o CompareTo ignorar maiúsculas e minúsculas, mas não temos tempo para procurar agora. Como outros já declararam, isso seria feito para classificação. Comparar a igualdade dessa maneira resultaria em custos indiretos desnecessários.
Tenho certeza de que estou deixando as coisas de fora, mas acho que essas informações devem ser suficientes para começar a experimentar se você precisar de mais detalhes.
fonte