Comment puis-je rendre la ligne ci-dessous insensible à la casse?
drUser["Enrolled"] =
(enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);
Plus tôt dans la journée, j'ai reçu des conseils qui m'ont suggéré d'utiliser:
x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));
le problème est que je ne peux pas faire fonctionner cela, j'ai essayé la ligne ci-dessous, cela compile mais renvoie les mauvais résultats, il renvoie les utilisateurs inscrits comme non inscrits et les utilisateurs non inscrits comme inscrits.
drUser["Enrolled"] =
(enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"],
StringComparison.OrdinalIgnoreCase)));
Quelqu'un peut-il signaler le problème?
drUser["Enrolled"]
être? Il ressemble à une valeur booléenne, maisFindIndex()
renvoie l'index. Si l'index de cet utilisateur est 0, il retournera 0, ce qui peut être faux. Quand, en réalité, c'est vrai. LaExists()
méthode peut être meilleure dans ce cas.Réponses:
Ce n'est pas la meilleure pratique dans .NET Framework (4 & +) pour vérifier l'égalité
Utilisez plutôt ce qui suit
MSDN recommande:
la source
string.Compare
, nonString.Compare
.string
est une meilleure pratique queString
puisqu'il s'agit d'un mot-clé de langue. D'une part,String
pourrait être autre chose queSystem.String
, alorsstring
qu'il ne peut pas l'être. En outre, ilstring
est plus ou moins garanti d'exister en C #, alors qu'ilString
fait techniquement partie de .NET plutôt que C #.Vous devez utiliser une
String.Compare
fonction statique comme suitla source
String.Equals
place deString.Compare
. Il n'est pas nécessaire de calculer lequel est le plus grand, juste qu'ils ne sont pas égaux.IEquatable
etIComparable
ne faites PAS la même chose, et vous pouvez avoir des classes qui implémentent l'une mais dans lesquelles cela n'aurait aucun sens d'implémenter l'autre. Par exemple, vous pouvez commander des échantillonnages de capteurs dans le temps sans qu'aucun d'entre eux ne soit égal (IComparable). Et, vous pouvez indiquer si les choses sont égales (IEquatable) mais cela n'a aucun sens de les commander (par exemple, les numéros de série des ordinateurs).Veuillez utiliser ceci pour la comparaison:
la source
D'autres réponses sont totalement valables ici, mais d'une manière ou d'une autre, cela prend un certain temps pour taper
StringComparison.OrdinalIgnoreCase
et également utiliserString.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 à la valeur booléenne, en attachant un extrait de code entier ici:
Après que toute la comparaison se raccourcisse de 10 caractères environ - comparez:
Avant d'utiliser l'extension String:
Après avoir utilisé l'extension String:
la source
Vous pouvez (bien que controversé) étendre
System.String
pour fournir une méthode d'extension de comparaison insensible à la casse:et utiliser comme tel:
C # vous permet de créer des méthodes d'extension qui peuvent servir de syntaxe au sucre dans votre projet, je dirais plutôt utile.
Ce n'est pas la réponse et je sais que cette question est ancienne et résolue, je voulais juste ajouter ces bits.
la source
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 Compare static sur la classe String pour comparer les deux chaînes. Le fait que la comparaison soit insensible à la casse est déterminé par le troisième paramètre de l'une de ses surcharges. Par exemple:
La valeur caseSensitiveResult est -1 (indiquant que lowerCase est "inférieur à" upperCase) et le caseInsensitiveResult est zéro (indiquant que lowerCase "est égal" à upperCase).
la source
Que diriez-vous d'utiliser à la
StringComparison.CurrentCultureIgnoreCase
place?la source
Je voudrais écrire une méthode d'extension pour EqualsIgnoreCase
la source
vous pouvez toujours utiliser des fonctions: .ToLower (); .ToUpper ();
convertissez vos chaînes puis comparez-les ...
Bonne chance
la source