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?
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)
- 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é .
Vous devriez utiliser la fonction statique String.Compare
comme suit
x => String.Compare (x.Username, (string)drUser["Username"],
StringComparison.OrdinalIgnoreCase) == 0
Veuillez utiliser ceci pour la comparaison:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
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)
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.
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).
Que diriez-vous d'utiliser StringComparison.CurrentCultureIgnoreCase
à la place?