2010-09-12 25 views
9

se faccio qualcosa di simile ...C#: Confusione circa ToUpper() e ToLower()

String myVar = "in"; 
if(myVar.ToUpper() == "in") 
{ 
    //do something 
} 

Questo non sta per andare dentro "se" blocco ..right?

o

sta andando a controllare sia per "IN" e "IN" e fare tutto ciò che c'è dentro che se? Se è così, perché è così? Non dovrebbe saltare ciò che c'è dentro il blocco "se"?

stessa confusione è circa ToLower() troppo

Edit: Quindi, per verificare la presenza di entrambi i casi, ho bisogno di scrivere:

if((myVar.ToUpper().Equals("in"))&&(myVar.Equals("in"))) 

come this..right?

+1

Il consiglio di Jon è solido, ma mi piacerebbe spiegare cosa è andato storto sopra. Se si desidera verificare che sia "in" e non si preoccupi del caso, si può fare "ToLower" e confrontarlo con "in" o "ToUpper" e confrontare con "IN". Non hai bisogno di confronti multipli. In ogni caso, raccomando ciò che Jon ha consigliato. –

risposta

43

Anziché convertire in maiuscolo e quindi confrontare, è necessario utilizzare un confronto di uguaglianza che può essere reso insensibile al maiuscolo/minuscolo. Per esempio:

if (myVar.Equals("in", StringComparison.OrdinalIgnoreCase)) 
{ 
    ... 
} 

si deve considerare attentamente esattamente quali regole siano adeguate - ordinali, la cultura attuale, la cultura invarianti, o forse un'altra cultura del tutto (per esempio usando StringComparer.Create(culture, true)).

Per ulteriori dettagli su questo argomento, leggere l'articolo MSDN Best Practices for Using Strings in the .NET Framework.

+0

+1 per essere (finora) l'unica risposta che menziona "cultura" oltre a minuscole e maiuscole. – stakx

+0

Per le affermazioni if ​​sono totalmente d'accordo con te, ma che dire dell'istruzione switch delle stringhe? Ho letto da qualche parte che è meglio convertire la stringa in maiuscolo, ad es. switch (myVar.ToUpper()) {case "MYCASE1": ...} –

+0

@ mjf196: Ciò dipende dal contesto: che cosa viene inserito in maiuscolo qui? Se si tratta di input da parte dell'utente, è davvero necessario pensare esattamente a ciò che si desidera che il comportamento sia. –

2

"IN" non è uguale a "in" - quindi non esegue il blocco if. Nel caso di toLower() eseguirà il blocco if come "in" uguale a "in" ..

5

L'espressione something.ToUpper().Equals("lowercaseletters") non sarà mai vera, quindi nell'esempio il blocco if non verrà eseguito. E, naturalmente, questo vale anche per ToLower; something.ToLower().Equals("UPPERCASE") non sarà mai vero neanche.

2

In primo luogo, se si desidera confrontare le stringhe utilizzare .equals()

myVar.toUpper().Equals("in") 

secondo prima tutto il codice all'interno del se viene eseguito, solo dopo che il ritorno è testato.

così

String myVar="in"; 
if(myVar.toUpper().Equals("in")) 
{ 
    //do something 
} 

non lo fanno "fare qualcosa".

+1

Ok, ti ​​morderò: perché usare 'Equals'? –

+0

Steven: fampinheiro sta scrivendo in Java apparentemente, dove 'Equals' è richiesto perché' == 'non è sovraccarico per le stringhe. – Gabe

+0

In alcune lingue l'operatore "==" confronta due riferimenti a oggetti per vedere se si riferiscono alla stessa istanza. Non credo che questo sia il caso di C#; l'operatore chiama String :: Equals sotto il cofano. Tuttavia confronta ancora i valori byte per byte, quindi è probabile che tu voglia .Compare() – RJFalconer

2

Se fate qualcosa come hai detto tu, non andrà in blocco if, ed ecco perché:

Gli operatori sono applicati all'oggetto sulla sinistra. Quindi il codice è lo stesso di scrivere questa:

String myVar="in"; 
String testVar = myVar.ToUpper(); 
if(testVar=="in") //This will never be true 
{ 
    //do something 
} 

In tua modifica, ancora non sta testando se la stringa è == "IN", che si sta facendo 2 test per vedere se la stringa è == "in".

Se è stata modificata l'originale a questo che avrebbe funzionato:

String myVar="in"; 
if(myVar.ToUpper()=="IN") 
{ 
    //do something 
} 

La modifica dovrebbe essere così per testare entrambi i casi:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

EDIT: Alcuni ulteriori spiegazioni dal Commento di Steven:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

Questo esempio di codice esegue 2 confronti, ma se myVar sarà sempre e solo la versione caso misto s of in (IE: in In iN IN) quindi il secondo confronto non è necessario. Una volta convertita la stringa in ToUpper(), devi solo verificare se è uguale a IN. Quindi vorrei sostituire quella linea con:

if(myVar.ToUpper().Equals("IN")) 

o

if(myVar.ToUpper() == "IN") 

Io personalmente usare il == non il metodo .equals.

+0

Non vedo il punto di fare entrambi i test. Se il secondo è vero, anche il primo sarà. Allo stesso modo, non so perché stai usando 'Equals'. Fai? –

+0

@Steven Lo sto usando perché è quello che l'OP usava nelle sue domande. Nella seconda situazione, hai ragione. Basta usarlo perché è quello che l'OP ha usato. – thorkia

+0

Beh, questo lo spiega, ma ti assicuro che le nostre risposte non sono obbligate a ripetere eventuali errori dalle domande. :-) –