web-dev-qa-db-fra.com

Comment puis-je comparer les chaînes sans tenir compte de la casse?

Comment puis-je rendre la ligne ci-dessous insensible à la casse?

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);

On m'a donné un conseil plus tôt aujourd'hui suggérant d'utiliser:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));

le problème est que je ne parviens pas à faire fonctionner cela. J'ai essayé la ligne ci-dessous. Cette opération compile mais renvoie des résultats erronés. Elle renvoie les utilisateurs inscrits en tant qu'utilisateurs non inscrits et inscrits.

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], 
                                 StringComparison.OrdinalIgnoreCase)));

Quelqu'un peut-il signaler le problème?

199
Jamie

Ce n'est pas la meilleure pratique dans .NET Framework (4 & +) pour vérifier l'égalité

String.Compare(x.Username, (string)drUser["Username"], 
                  StringComparison.OrdinalIgnoreCase) == 0

Utilisez ce qui suit à la place

String.Equals(x.Username, (string)drUser["Username"], 
                   StringComparison.OrdinalIgnoreCase) 

MSDN recommande:

  • Utilisez une surcharge de la méthode String.Equals pour tester si deux chaînes sont égales.
  • Utilisez les méthodes String.Compare et String.CompareTo pour trier les chaînes, pour ne pas vérifier l'égalité .
373
ocean4dream

Vous devriez utiliser la fonction statique String.Compare comme suit

x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0
35
Oleg

Veuillez utiliser ceci pour la comparaison:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
20
Gautam Kumar Sahu

Les autres réponses sont tout à fait valables ici, mais cela prend du temps de taper StringComparison.OrdinalIgnoreCase et d’utiliser également 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, en joignant un extrait de code complet ici:

using System;

/// <summary>
/// String helpers.
/// </summary>
public static class StringExtensions
{
    /// <summary>
    /// Compares two strings, set ignoreCase to true to ignore case comparison ('A' == 'a')
    /// </summary>
    public static bool CompareTo(this string strA, string strB, bool ignoreCase)
    {
        return String.Compare(strA, strB, ignoreCase) == 0;
    }
}

Après que toute la comparaison raccourcisse d'environ 10 caractères - comparez:

Avant d'utiliser l'extension de chaîne:

String.Compare(testFilename, testToStart,true) != 0

Après avoir utilisé l'extension de chaîne:

testFilename.CompareTo(testToStart, true)
7
TarmoPikaro

Vous pouvez (bien que controversé) étendre System.String pour fournir une méthode d'extension de comparaison insensible à la casse:

public static bool CIEquals(this String a, String b) {
    return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}

et utiliser en tant que tel:

x.Username.CIEquals((string)drUser["Username"]);

C # vous permet de créer des méthodes d'extension qui peuvent servir de syntaxe suggar dans votre projet, ce qui est très utile, je dirais.

Ce n'est pas la réponse et je sais que cette question est ancienne et résolue, je voulais juste ajouter ces éléments.

4
Felype

Je pense que vous trouverez plus d'informations dans ce lien:

http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/

Utilisez la méthode statique de comparaison de la classe String pour comparer les deux chaînes. Le caractère non sensible à la casse de la comparaison est déterminé par le troisième paramètre de l'une de ses surcharges. Par exemple:

string lowerCase = "abc";
string upperCase = "AbC";
int caseInsensitiveResult = string.Compare(lowerCase, upperCase,
  StringComparison.CurrentCultureIgnoreCase);
int caseSensitiveResult = string.Compare(lowerCase,
  StringComparison.CurrentCulture);

La valeur caseSensitiveResult est -1 (indiquant que lowerCase est "inférieur à" upperCase) et que casInsensitiveResult est égal à zéro (indiquant que lowerCase "est égal à" upperCase).

3
i_th

Que diriez-vous d'utiliser StringComparison.CurrentCultureIgnoreCase à la place?

1
decyclone