2010-06-25 4 views
11

Sto leggendo un nome utente e quindi controllo per vedere se esiste in un'altra tabella di database, il problema è mentre il nome utente è lo stesso il caso forse diverso e impedisce di trovare un esempio di corrispondenza jsmith e JSmith o JSMITH.C# Confronto tra stringhe con caso diverso

Come posso risolvere questo? Devo abbassare il caso quando scrivo al primo database o posso modificare il mio codice qui sotto quando sto confrontando i due?

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

UPDATE:

ancora alle prese con questo, il codice qui sotto compila ma non dà il risultato corretto, quando si visualizzano gli utenti iscritti vedo coloro che non sono iscritti, durante la visualizzazione di quelli che non lo sono iscritto vedo 1 iscritto, ma il loro nome utente è lo stesso in ogni database. Ho formattato correttamente il codice qui sotto?

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

Grazie Jamie

+1

Dang, ero troppo lento. Ho pensato che sarebbe stato appropriato per me rispondere a questo ..;) – jsmith

+0

@jsmith: Cosa? – SLaks

+1

@SLaks il suo nome di esempio .. è il mio nome utente .. :) – jsmith

risposta

21

È necessario cal la Equals method, che prende un parametro StringComparison.

Ad esempio:

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

Se x.Username può essere null, è necessario chiamare il static Equals method:

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

In caso contrario, x.Username.Equals può lanciare una NullReferenceException.

+0

Mi spiace di sembrare denso ma il codice sottostante non funziona correttamente, compila ma non trova gli utenti corrispondenti. drUser ["Enrolled"] = (enrolledUsers.FindIndex (x => x.Username.Equals ((string) drUser ["Username"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Ho appena provato l'aggiornamento e questo non viene compilato. Dove sto andando male? drUser ["Enrolled"] = (enrolledUsers.FindIndex (String.Equals (x.Username, (string) drUser ["Username"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Modifica la tua domanda e aggiungi il tuo codice esatto. – SLaks

3

Il modo migliore per fare questo, è quello di specificare il confronto di stringhe utilizzando qualcosa come

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

per fare il controllo di uguaglianza, invece di "=="

+0

Questo non verrà compilato (hai dimenticato di trasmettere). – SLaks

+0

buon posto - grazie! –

0

Come sull'utilizzo ToUpper() .

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

si prega di fornire un motivo per il voto negativo. Mi piacerebbe sapere perché questo codice è una cattiva pratica. Grazie – MikeTWebb

+0

Non ti ho minimizzato, ma posso indovinare perché. Innanzitutto, esploderà se uno dei due valori è nullo. In secondo luogo, questo non è consapevole della cultura. Può funzionare anche per l'inglese (e anche per molte altre lingue), ma non per tutti. L'esempio spesso citato è "The Turkish Case": http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html . Net offre confronti di stringhe culturalmente consapevoli gratuitamente - usali! –

+0

Lontano .... grazie per la spiegazione. Molto apprezzato. Sì, per quanto riguarda i NULL .... l'esempio di codice non era destinato a essere a prova di proiettile. Controllo sempre i NULL. – MikeTWebb

0

Hai provato questo?

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

C'è un motivo per cui si sta utilizzando FindIndex?