167 votes

Existe-t-il en C# un opérateur égal insensible à la casse ?

Je sais que ce qui suit est sensible à la casse :

if (StringA == StringB) {

Existe-t-il donc un opérateur qui compare deux chaînes de caractères de manière insensible ?

0 votes

0 votes

Si quelqu'un tombe sur cette question à la recherche d'une comparaison insensible à la casse pour un Dictionary<string,int>, consultez cette question ici : Accès insensible à la casse pour le dictionnaire générique

1 votes

Ce serait vraiment bien ; disons de définir un correspondant ~= en parallèle == comme une version insensible à la casse.

302voto

John Feminella Points 116878

Essayez ça :

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

0 votes

Je suis relativement novice en matière de StackOverflow. Pouvez-vous expliquer ce que vous entendez par "ajouter un lien" ? Voulez-vous dire vers les documents MSDN ?

0 votes

Vous pouvez ajouter un lien vers MSDN (ce que je fais habituellement) ou si vous trouvez des articles de blog intéressants ou autres qui pourraient développer la réponse.

1 votes

Et vous pourriez enrichir votre réponse en essayant de vous rapprocher de ce que l'auteur de la question voulait. Dans ce cas, vous pourriez publier une méthode d'extension rapide.

43voto

Pavel Vladov Points 1074

Le meilleur moyen pour comparer 2 chaînes de caractères sans tenir compte de la casse des lettres, il faut utiliser la fonction String.Equals Méthode statique spécifiant une comparaison de chaînes de caractères ignorant la casse ordinale. C'est également la méthode la plus rapide, beaucoup plus rapide que de convertir les chaînes en minuscules ou en majuscules et de les comparer ensuite.

J'ai testé les performances des deux approches et la comparaison de la chaîne de cas ignorée ordinale était plus de 9 fois plus rapide ! C'est également plus fiable que la conversion des chaînes de caractères en minuscules ou en majuscules (voir le problème du i turc). Utilisez donc toujours la fonction String.Equals pour comparer l'égalité des chaînes de caractères :

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);

Si vous souhaitez effectuer une comparaison de chaînes de caractères spécifique à une culture, vous pouvez utiliser le code suivant :

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);

Veuillez noter que le deuxième exemple utilise la logique de comparaison de chaînes de la culture actuelle, ce qui le rend plus lent que la comparaison "ordinal ignore case" du premier exemple. Si vous n'avez pas besoin d'une logique de comparaison de chaînes spécifique à la culture et que vous recherchez des performances maximales, utilisez la comparaison "ordinal ignore case".

Pour plus d'informations, lire l'histoire complète sur mon blog .

2 votes

Ne suggérez pas ToLower o ToLowerInvariant ils créent de la mémoire juste pour effectuer une comparaison, et ils peuvent échouer lorsque de nouveaux jeux de caractères sont ajoutés à l'unicode. ToUpper échoue à cause du "i" turc, entre autres ; il n'y a pas de raison pour que ToLower n'échouera pas à l'avenir pour des raisons similaires.

0 votes

@antiduh, merci pour votre commentaire. La plupart d'entre nous sont conscients de ces problèmes potentiels, de nombreux tutoriels sur Internet donnent le 'i' turc comme exemple. Comme vous le voyez dans mon message, je ne recommande pas l'utilisation de la fonction ToLower o ToLowerInvariant je voulais simplement montrer à quel point la méthode de la String.Equals la méthode est.

5 votes

"La plupart d'entre nous sont conscients de ces problèmes potentiels, de nombreux tutoriels sur Internet donnent le 'i' turc comme exemple" - pas assez de gens le sont, et vous le mentionnez quand même comme deuxième phrase de votre réponse. De plus, votre réponse ne comporte pas de justification suffisante pour ne jamais l'utiliser - vous mentionnez simplement les performances ; or, les performances ne sont pas toujours la priorité absolue. En conséquence, vous violez actuellement les directives relatives aux centres d'aide ; les liens vers des sites externes sont acceptés, mais vous n'avez pas suffisamment résumé le contenu (problème du "i" turc). SO n'est pas votre plate-forme publicitaire.

20voto

Kyralessa Points 76456

Il y a un certain nombre de propriétés sur le StringComparer Classe statique qui renvoie des comparateurs pour tout type de sensibilité à la casse que vous pourriez souhaiter :

StringComparer Propriétés

Par exemple, vous pouvez appeler

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)

ou

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)

C'est un peu plus propre que le string.Equals o string.Compare qui prennent un StringComparison argument.

14voto

leppie Points 67289
System.Collections.CaseInsensitiveComparer

ou

System.StringComparer.OrdinalIgnoreCase

0 votes

Cela affecte-t-il l'ensemble de l'application ?

3 votes

Où puis-je trouver plus d'informations à ce sujet ? Cela signifie-t-il que je peux utiliser == pour une correspondance insensible à la casse ?

9voto

Erick Points 2430
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X