12
votes

C # comparer des chaînes avec des cas différents

Je lis, je lis un nom d'utilisateur, puis vérifiant pour voir s'il existe dans une autre table de base de données, le problème est que le nom d'utilisateur est identique au cas peut-être différent et empêche de trouver un exemple de correspondance Jsmith et Jsmith ou Jsmith. < p> Comment puis-je résoudre ce problème? Devrais-je réduire le cas lors de l'écriture de la première base de données ou puis-je modifier mon code ci-dessous lorsque je comparais les deux? xxx

mise à jour:

Toujours en difficulté avec cela, le code ci-dessous compile mais ne donne pas le résultat correct, lors de la visualisation des utilisateurs inscrits, je vois ceux qui ne sont pas inscrits, lors de la visualisation de ceux qui ne sont pas inscrits, je vois 1 inscrit mais leur cas d'utilisateur est le idem dans chaque baquet de données. Ai-je formaté le code ci-dessous correctement? xxx

merci Jamie


6 commentaires

Dang, j'étais trop lent. Pensé qu'il serait approprié que je réponde à celui-ci ..;)


@Slaks son exemple de nom .. est mon nom d'utilisateur .. :)


@Jamie: Quand je suis confronté à un code qui semble que cela fonctionne, mais ne le trouve pas, alors je trouve utile de la décomposer et de vérifier toutes mes hypothèses. C'est à dire. Fait correspond à ce que vous attendez lorsque vous comparez deux chaînes (comme mentionné ci-dessous, les paramètres de culture peuvent faire une différence). Si cela fonctionne, vérifiez si FINDIDEX fonctionne sur une correspondance exacte. etc.


Vous voudrez peut-être utiliser quelque chose comme Exist (), voir ma réponse ci-dessous.


Il convient de noter que pour certains ensembles de caractères, il est plus efficace de convertir en majuscule au lieu de la baisse. De plus, cela exactement le genre de chose stocké des procédures.


@David: Et pour d'autres ensembles de caractères, l'inverse est vrai. En assii minuscule == majuscule | 0x20. Donc, si vous souhaitez vérifier si un personnage tombe dans la gamme 'A-ZA-Z', vous pouvez faire "(CH | 0x20) dans ['A-Z'])". Bien sûr, si vous souhaitez coder une routine TUPPER, vous devriez vérifier si elle est en première portée avant de la modifier. Mais cela ne fonctionnera probablement pas pour d'autres ensembles de caractères, alors à moins que vous ne puissiez garantir vos données, évitez-la. J'ai couru un petit test de conversion de caractères avec une bibliothèque sensible à la culture pour les fonctions supérieures et inférieures et ont tous deux couru à travers un million d'une fraction d'une seconde.


5 Réponses :


21
votes

3 commentaires

Désolé de sonner l'épaisseur, mais le code ci-dessous ne fonctionne pas correctement, il compile mais ne trouve pas les utilisateurs correspondants. druseur ["inscrit"] = (inscrittus.findindex (x => x.username.equals ((string) druser ["nom d'utilisateur"], stringcomparisonon.ordinalignorecase)));


Je viens d'essayer la mise à jour et cela ne compile pas. Où est-ce que je vais mal? druser ["inscrit"] = (inscrittus.findindex.findindex (string.equals (x.username, (string) druser ["Nom d'utilisateur"], stringcomparisonison.ordinalIntorecase)));


Veuillez éditer votre question et ajouter votre code exact.



3
votes

La manière préférée de le faire, c'est spécifier la comparaison des chaînes en utilisant quelque chose comme xxx

pour effectuer la vérification de l'égalité, au lieu de "==" >


1 commentaires

Cela ne compilera pas (vous avez oublié de lancer).



0
votes

Que diriez-vous d'utiliser TUPPER ().

 if(!(dr["Enrolled"] == null || dr["Username"] == null))
 {
    if(dr["Enrolled"].ToString().ToUpperInvariant()== dr["Username"].ToString().ToUpperInvariant())
    {
        //Do Something
    }
}


5 commentaires

Veuillez fournir une raison pour le vote en direct. J'aimerais apprendre pourquoi ce code est une mauvaise pratique. Merci


Je ne t'ai pas répondu, mais je peux deviner pourquoi. Premièrement, cela explosera si l'une des valeurs est nulle. Deuxièmement, ce n'est pas le conscience de la culture. Cela peut fonctionner pour l'anglais (et beaucoup d'autres langues aussi), mais pas tous. L'exemple de l'OFT-cité est "The Turc Case": Moserware.com/2008/02/DOES-Your-Code-Pass-Turkey-Test.html .NET Vous donne gratuitement des comparaisons de chaîne à la culture - utilisez-les!


Loin ... merci pour l'explication. Très appréciée. Ouais, aussi loin que les NuLs ... L'exemple de code n'était pas destiné à être une épreuve de balle. Je vérifie toujours les nulls.


Note latérale: ToupperInvariant serait votre moyen d'aller ensuite.


En tant que note latérale, Toupper crée également une nouvelle chaîne supplémentaire. Ce n'est pas une grosse affaire pour une petite ficelle ici ou là, mais si vous faites beaucoup de comparaisons, il semble un peu gaspillé de créer une temporaire juste pour faire le comparateur.



0
votes

Avez-vous essayé cela?

string userName = (string)drUser["Username"];
bool enrolled = enrolledUsers.Exists(x =>
  string.Equals(x.Name, userName, StringComparison.CurrentCultureIgnoreCase));


0 commentaires

0
votes

Essayez la méthode String.chare. Toutes les surcharges

ou A plus Spécifique One

Si rien d'autre, j'espère que cela éduque.


0 commentaires