Y a-t-il un opérateur égal insensible à la casse c#?

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

if (StringA == StringB) {

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

138
demandé sur Jon Seigel 2009-03-10 19:52:52

13 réponses

Essayez ceci:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
260
répondu John Feminella 2009-03-10 16:54:31

La meilleure façon pour comparer 2 chaînes en ignorant la casse des lettres est d'utiliser le String.Est égal à méthode statique 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 minuscules ou majuscules et de les comparer après cela.

J'ai testé les performances des deux approches et la comparaison ordinale des chaînes de cas ignorées était plus de 9 fois plus rapide! Il est également plus fiable que la conversion chaînes en minuscules ou majuscules (consultez le problème Turc i). Donc, utilisez toujours la chaîne .Equals méthode 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îne de la culture actuelle, ce qui la rend plus lente que la comparaison "ordinale ignore case" dans le premier exemple, donc si vous n'avez pas besoin de culture logique de comparaison de chaîne spécifique et vous êtes après une performance maximale, utilisez la comparaison "ordinal ignore case".

Pour plus d'informations, lire l'article complet sur mon blog.

21
répondu Pavel Vladov 2018-02-26 11:20:53

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

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 les surcharges string.Equals ou string.Compare qui prennent un StringComparison argument.

17
répondu Ryan Lundy 2009-03-10 23:04:13
System.Collections.CaseInsensitiveComparer

Ou

System.StringComparer.OrdinalIgnoreCase
14
répondu leppie 2009-03-10 16:54:40
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
9
répondu Erick 2009-03-10 16:55:27

Ou

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {

Mais vous devez être sûr que StringA n'est pas null. Donc probablement mieux Tu utiliser:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);

Comme John l'a suggéré

EDIT: correction du bug

7
répondu Grzenio 2009-03-13 09:33:27

Vous pouvez utiliser

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
3
répondu Andy Mikula 2009-03-10 16:56:01

Opérateur? Non, mais je pense que vous pouvez changer votre 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 confiant qu'il va changer la façon dont les chaînes sont comparées par l'opérateur=.

3
répondu John Leidegren 2009-03-10 17:00:25

Je suis tellement habituée à taper à la fin de ces méthodes de comparaison: , StringComparison.

J'ai donc fait une prolongation.

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 l'ext.

2
répondu Valamas 2014-01-17 21:39:19

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
1
répondu renouve 2018-05-09 12:30:49
string.Compare(string1, string2, true)
0
répondu user25623 2009-03-10 17:19:29
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

Les gens rapportent que ToUpperInvariant () est plus rapide que ToLowerInvariant ().

0
répondu knoopx 2009-03-10 17:21:38

Les autres réponses sont totalement valides ici, mais il faut du temps pour taper StringComparison.OrdinalIgnoreCase et aussi utiliser String.Compare.

J'ai codé une méthode D'extension de chaîne simple, où vous pouvez spécifier si la comparaison est sensible à la casse ou insensée avec booléen - voir la réponse suivante:

Https://stackoverflow.com/a/49208128/2338477

0
répondu TarmoPikaro 2018-03-10 10:46:33