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 ?
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 ?
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 ?
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.
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.
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 .
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.
@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.
"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.
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 :
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.
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.
0 votes
Duplicata possible de Comparaison sans casse de chaînes de caractères en C#
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.0 votes
Si les développeurs de Microsoft voient cela, je pense qu'il y a un besoin pour un opérateur insensible à la casse dans la prochaine version de csharp. Ce string.Equal() est long.