Je sais que ce qui suit est sensible à la casse:
if (StringA == StringB) {
Y a-t-il donc un opérateur qui comparera deux chaînes de manière insensible?
~=
à parallèle ==
comme une version insensible à la casse.
Je sais que ce qui suit est sensible à la casse:
if (StringA == StringB) {
Y a-t-il donc un opérateur qui comparera deux chaînes de manière insensible?
~=
à parallèle ==
comme une version insensible à la casse.
Réponses:
Essaye ça:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
if A$=B$ then goto 10
"
La meilleure façon de comparer 2 chaînes en ignorant la casse des lettres est d'utiliser la méthode statique String.Equals en spécifiant une comparaison de chaîne ordinale ignorant la casse. C'est aussi le moyen le plus rapide, beaucoup plus rapide que de convertir les chaînes en minuscules ou majuscules et de les comparer ensuite.
J'ai testé les performances des deux approches et la comparaison des chaînes ordinales ignorées était plus de 9 fois plus rapide ! Il est également plus fiable que la conversion de chaînes en minuscules ou majuscules (consultez le problème turc i). Utilisez donc toujours la méthode String.Equals pour comparer les chaînes pour l'égalité:
String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
Si vous souhaitez effectuer une comparaison de chaînes spécifiques à 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 la rend plus lente que la comparaison "ordinal ignore case" dans le premier exemple, donc si vous n'avez pas besoin d'une logique de comparaison de chaînes spécifique à la culture et que vous êtes après des performances maximales, utilisez la comparaison «ordinal ignorer la casse».
Pour plus d'informations, lisez l'histoire complète sur mon blog .
ToLower
ou 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 aucune raison de ToLower
ne pas échouer à l'avenir pour des raisons similaires.
ToLower
ou ToLowerInvariant
, je voulais juste montrer à quel point la String.Equals
méthode est plus efficace .
Il existe un certain nombre de propriétés sur la StringComparer
classe statique qui renvoient 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 les surcharges string.Equals
ou string.Compare
qui prennent un StringComparison
argument.
System.Collections.CaseInsensitiveComparer
ou
System.StringComparer.OrdinalIgnoreCase
ou
if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
mais vous devez vous assurer que StringA n'est pas nul. Il vaut donc probablement mieux utiliser:
string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);
comme John l'a suggéré
EDIT: correction du bug
Vous pouvez utiliser
if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
Opérateur? NON, mais je pense que vous pouvez changer votre culture afin que la comparaison de chaînes ne soit pas sensible à la casse.
// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo
Je suis convaincu que cela changera la façon dont les chaînes sont comparées par l'opérateur égal.
Voici une idée pour simplifier la syntaxe:
public class IgnoreCase
{
private readonly string _value;
public IgnoreCase(string s)
{
_value = s;
}
protected bool Equals(IgnoreCase other)
{
return this == other;
}
public override bool Equals(object obj)
{
return obj != null &&
(ReferenceEquals(this, obj) || (obj.GetType() == GetType() && this == (IgnoreCase) obj));
}
public override int GetHashCode()
{
return _value?.GetHashCode() ?? 0;
}
public static bool operator ==(IgnoreCase a, IgnoreCase b)
{
return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
public static bool operator !=(IgnoreCase a, IgnoreCase b)
{
return !(a == b);
}
public static implicit operator string(IgnoreCase s)
{
return s._value;
}
public static implicit operator IgnoreCase(string s)
{
return new IgnoreCase(s);
}
}
Utilisable comme:
Console.WriteLine((IgnoreCase) "a" == "b"); // false
Console.WriteLine((IgnoreCase) "abc" == "abC"); // true
Console.WriteLine((IgnoreCase) "Abc" == "aBc"); // true
Console.WriteLine((IgnoreCase) "ABC" == "ABC"); // true
IgnoreCase
vs IgnoreCaseString
) et ambiguë (Java prend unboxing implicite vs boxe implicite , donc je crois que cela ne fonctionnerait pas en Java avec le dos coulé implicite à chaîne là - dedans). Et cela crée la surcharge de mémoire de 2 nouveaux objets avec l'exécution de l'arborescence des appels pour chaque comparaison sautant dans plusieurs appels de méthode imbriqués pour le cas d'utilisation affiché. Cela dit, dans la plupart des cas, les performances sont probablement assez bonnes.
Je suis tellement habitué à taper à la fin de ces méthodes de comparaison: , StringComparison.
J'ai donc fait une extension.
namespace System
{ public static class StringExtension
{
public static bool Equals(this string thisString, string compareString,
StringComparison stringComparison)
{
return string.Equals(thisString, compareString, stringComparison);
}
}
}
Notez simplement que vous devrez vérifier la valeur null sur thisString
avant d'appeler le poste.
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
Les gens rapportent que ToUpperInvariant () est plus rapide que ToLowerInvariant ().
D'autres réponses sont totalement valables ici, mais d'une manière ou d'une autre, il faut un certain temps pour taper StringComparison.OrdinalIgnoreCase
et utiliserString.Compare
.
J'ai codé la méthode d'extension de chaîne simple, dans laquelle vous pouvez spécifier si la comparaison est sensible à la casse ou à la casse avec booléen - voir la réponse suivante: