La comparaison de chaînes en C # est assez simple. En fait, il existe plusieurs façons de procéder. J'en ai énuméré quelques-uns dans le bloc ci-dessous. Ce qui m'intéresse, ce sont les différences entre eux et quand l'un devrait être utilisé par rapport aux autres? Faut-il à tout prix éviter? Y en a-t-il d'autres que je n'ai pas répertoriés?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(Remarque: je recherche l'égalité dans cet exemple, pas moins ou plus que mais n'hésitez pas à commenter cela également)
c#
string
comparison
Craig
la source
la source
Réponses:
Voici les règles de fonctionnement de ces fonctions:
stringValue.CompareTo(otherStringValue)
null
vient avant une chaîneCultureInfo.CurrentCulture.CompareInfo.Compare
, ce qui signifie qu'il utilisera une comparaison dépendante de la culture. Cela pourrait signifier queß
sera comparable àSS
en Allemagne, ou similairestringValue.Equals(otherStringValue)
null
n'est pas considéré comme égal à quoi que ce soitStringComparison
option, il utilisera ce qui ressemble à une vérification directe de l'égalité ordinale, c'estß
-à- dire qui n'est pas la même queSS
dans n'importe quelle langue ou culturestringValue == otherStringValue
stringValue.Equals()
.==
opérateur appelle laEquals(string a, string b)
méthode statique (qui à son tour va à un interneEqualsHelper
pour faire la comparaison..Equals()
sur unenull
chaîne obtient unenull
exception de référence,==
contrairement à on.Object.ReferenceEquals(stringValue, otherStringValue)
Vérifie simplement que les références sont les mêmes, c'est-à-dire qu'il ne s'agit pas seulement de deux chaînes avec le même contenu, vous comparez un objet chaîne avec lui-même.
Notez qu'avec les options ci-dessus qui utilisent des appels de méthode, il y a des surcharges avec plus d'options pour spécifier comment comparer.
Mon conseil si vous voulez simplement vérifier l'égalité est de décider si vous voulez utiliser une comparaison dépendante de la culture ou non, puis utilisez
.CompareTo
ou.Equals
, selon le choix.la source
String.Compare
?Depuis MSDN:
Ils suggèrent d'utiliser
.Equals
plutôt que de.CompareTo
rechercher uniquement l'égalité. Je ne sais pas s'il y a une différence entre.Equals
et==
pour lastring
classe. J'utiliserai parfois.Equals
ouObject.ReferenceEquals
au lieu de==
pour mes propres classes au cas où quelqu'un viendrait plus tard et redéfinirait l'==
opérateur pour cette classe.la source
Si vous êtes curieux de connaître les différences dans les méthodes BCL, Reflector est votre ami :-)
Je suis ces directives:
Correspondance exacte: EDIT: j'ai toujours utilisé l'opérateur == sur le principe que dans Equals (chaîne, chaîne), l'opérateur objet == est utilisé pour comparer les références d'objet, mais il semble que strA.Equals (strB) soit toujours de 1 à 11%. globalement plus rapide que string.Equals (strA, strB), strA == strB et string.CompareOrdinal (strA, strB). J'ai testé en boucle avec un chronomètre sur les deux valeurs de chaîne internes / non internes, avec des longueurs de chaîne identiques / différentes et des tailles variables (1B à 5MB).
Correspondance lisible par l'homme (cultures occidentales, insensible à la casse):
Correspondance lisible par l'homme (toutes les autres cultures, cas / accent / kana / etc insensible défini par CultureInfo):
Correspondance lisible par l'homme avec des règles personnalisées (toutes les autres cultures):
la source
Comme l'a dit Ed , CompareTo est utilisé pour le tri.
Il existe cependant une différence entre .Equals et ==.
== résout essentiellement le code suivant:
La raison simple est que ce qui suit lèvera une exception:
Et ce qui suit ne sera pas:
la source
De bonnes explications et pratiques sur les problèmes de comparaison de chaînes peuvent être trouvées dans l'article Nouvelles recommandations pour l'utilisation de chaînes dans Microsoft .NET 2.0 et également dans Meilleures pratiques pour l'utilisation de chaînes dans .NET Framework .
Chacune des méthodes mentionnées (et d'autres) a un objectif particulier. La principale différence entre eux est le type d' énumération StringComparison qu'ils utilisent par défaut. Il existe plusieurs options:
Chacun des types de comparaison ci-dessus cible un cas d'utilisation différent:
Notez que l' énumération StringComparison ainsi que les surcharges pour les méthodes de comparaison de chaînes existent depuis .NET 2.0.
String.CompareTo, méthode (String)
Est en fait une implémentation sûre de la méthode IComparable.CompareTo . Interprétation par défaut: CurrentCulture.
Usage:
Donc
String.Compare, méthode
Un membre statique de String Class qui a de nombreuses surcharges. Interprétation par défaut: CurrentCulture.
String.Equals, méthode
Overriden de la classe Object et surchargé pour la sécurité du type. Interprétation par défaut: Ordinal. Remarquerez que:
Classe StringComparer
Il existe également une autre façon de gérer les comparaisons de chaînes, notamment le tri:
la source
Ce n'est pas que les performances comptent généralement avec 99% des fois où vous devez le faire, mais si vous deviez le faire en boucle plusieurs millions de fois, je vous suggère fortement d'utiliser .Equals ou == car dès qu'il trouve un personnage cela ne correspond pas, cela jette le tout comme faux, mais si vous utilisez CompareTo, il devra déterminer quel caractère est inférieur à l'autre, ce qui entraîne un temps de performance légèrement pire.
Si votre application s'exécute dans différents pays, je vous recommande de jeter un coup d'œil aux implications de CultureInfo et éventuellement d'utiliser .Equals. Comme je n'écris vraiment que des applications pour les États-Unis (et je me fiche que cela ne fonctionne pas correctement pour quelqu'un), j'utilise toujours ==.
la source
Dans les formulaires que vous avez énumérés ici, il n'y a pas beaucoup de différence entre les deux.
CompareTo
finit par appeler uneCompareInfo
méthode qui fait une comparaison en utilisant la culture actuelle;Equals
est appelé par l'==
opérateur.Si vous envisagez des surcharges, les choses deviennent différentes.
Compare
et==
ne peut utiliser la culture actuelle que pour comparer une chaîne.Equals
etString.Compare
peut prendre unStringComparison
argument d'énumération qui vous permet de spécifier des comparaisons insensibles à la culture ou à la casse. VousString.Compare
permet uniquement de spécifierCultureInfo
et d'effectuer des comparaisons à l'aide d'une culture autre que la culture par défaut.En raison de sa polyvalence, je trouve que j'utilise
String.Compare
plus que toute autre méthode de comparaison; cela me permet de spécifier exactement ce que je veux.la source
Une GRANDE différence à noter est que .Equals () lèvera une exception si la première chaîne est nulle, alors que == ne le fera pas.
la source
la source
L'utilisation de .Equals est également beaucoup plus facile à lire .
la source
avec .Equals, vous bénéficiez également des options StringComparison. très pratique pour ignorer la casse et d'autres choses.
btw, ce sera faux
Puisque == compare les valeurs de a et b (qui sont des pointeurs), cela ne sera évalué à vrai que si les pointeurs pointent vers le même objet en mémoire. .Equals déréférence les pointeurs et compare les valeurs stockées au niveau des pointeurs. a. Les égalités (b) seraient vraies ici.
et si vous changez b en:
alors a.Equals (b) est faux, mais
serait vrai
a.CompareTo (b) appelle la fonction CompareTo de la chaîne qui compare les valeurs aux pointeurs et renvoie <0 si la valeur stockée à a est inférieure à la valeur stockée à b, renvoie 0 si a.Equals (b) est vraie, et > 0 sinon. Cependant, ceci est sensible à la casse, je pense qu'il existe probablement des options pour CompareTo pour ignorer la casse et autres, mais n'avons pas le temps de regarder maintenant. Comme d'autres l'ont déjà dit, cela se ferait pour le tri. La comparaison de l'égalité de cette manière entraînerait des frais généraux inutiles.
Je suis sûr que je laisse de côté, mais je pense que cela devrait être assez d'informations pour commencer à expérimenter si vous avez besoin de plus de détails.
la source