Je sais que ce qui suit est sensible à la casse:
if (StringA == StringB) {
Existe-t-il un opérateur qui compare deux chaînes de manière insensible?
Essaye ça:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Le meilleur moyen de comparer 2 chaînes en ignorant la casse des lettres est d'utiliser la méthode String.Equals static en spécifiant une comparaison de chaîne de casse ignorée ordinale. C'est aussi le moyen le plus rapide, beaucoup plus rapide que de convertir les chaînes en majuscules ou minuscules et de les comparer par la suite.
J'ai testé les performances des deux approches et l'ordinal ignorer la comparaison des chaînes de casse était plus de 9 fois plus rapide! Il est également plus fiable que la conversion de chaînes en majuscules ou en minuscules (consultez le problème turc i). Donc, utilisez 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îne spécifique à la 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 "casse ignorée" dans le premier exemple. Par conséquent, si vous n'avez pas besoin d'une logique de comparaison de chaînes spécifique à une culture, après des performances maximales, utilisez la comparaison "ordinal ignore case".
Pour plus d'informations, lisez l'histoire complète sur mon blog .
Un certain nombre de propriétés de la classe statique StringComparer
permettent de renvoyer des comparateurs pour tout type de respect de la casse souhaité:
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 argument StringComparison
.
System.Collections.CaseInsensitiveComparer
ou
System.StringComparer.OrdinalIgnoreCase
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
ou
if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
mais vous devez être sûr que StringA n'est pas null. Donc, probablement une meilleure utilisation tu:
string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);
comme l'a suggéré John
EDIT: corrigé le bug
Vous pouvez utiliser
if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
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
Opérateur? NON, mais je pense que vous pouvez changer de culture pour 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 l'opérateur compare le traitement des chaînes.
Je suis tellement habitué à taper à la fin de ces méthodes de comparaison: , StringComparison.
Alors j'ai 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.
string.Compare(string1, string2, true)
Les autres réponses sont tout à fait valables ici, mais il faut un certain temps pour taper StringComparison.OrdinalIgnoreCase
et aussi pour utiliser String.Compare
.
J'ai codé une méthode d'extension de chaîne simple, dans laquelle vous pouvez spécifier si la comparaison est sensible à la casse ou insensée à la casse avec boolean - voir la réponse suivante:
Il suffit de faire
if (stringA.toLower() == stringB) {};
Ensuite, écrivez StringB en minuscule, pour faire aussi stringB.toLower()
.
.toLower()
renvoie une copie de la chaîne en minuscule et ne modifiera donc pas la chaîne d'origine.
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
Les utilisateurs signalent que ToUpperInvariant () est plus rapide que ToLowerInvariant ().