Come convertire "0" e "1" in falso e vero


90

Ho un metodo che si connette a un database tramite Odbc. La stored procedure che sto chiamando ha un valore di ritorno che dal lato del database è un "Char". In questo momento sto prendendo quel valore di ritorno come una stringa e lo sto usando in una semplice istruzione if. Non mi piace davvero l'idea di confrontare una stringa come questa quando solo due valori possono tornare dal database, 0 e 1.

OdbcCommand fetchCommand = new OdbcCommand(storedProc, conn);

fetchCommand.CommandType = CommandType.StoredProcedure;
fetchCommand.Parameters.AddWithValue("@column ", myCustomParameter);
fetchCommand.Parameters.Add("@myReturnValue", OdbcType.Char, 1)
            .Direction = ParameterDirection.Output;
fetchCommand.ExecuteNonQuery();

string returnValue = fetchCommand.Parameters["@myReturnValue"].Value.ToString();
if (returnValue == "1")
{
    return true;
} 

Quale sarebbe il modo corretto per gestire questa situazione. Ho provato "Convert.ToBoolean ()" che sembrava la risposta ovvia, ma mi sono imbattuto nel "String non è stato riconosciuto come booleano valido. 'eccezione generata. Mi manca qualcosa qui o c'è un altro modo per fare in modo che "1" e "0" si comportino come veri e falsi?

Grazie!

Risposte:


156

Che ne dite di:

return (returnValue == "1");

o come suggerito di seguito:

return (returnValue != "0");

Quello corretto dipenderà da ciò che stai cercando come risultato di successo.


9
Corretta? Dai un'occhiata; Conciso? Dai un'occhiata; Elegante? Dai un'occhiata. +1.
Earlz

11
Consiglierei di usare return (returnValue!="0"). Sarebbe più naturale che 0sia falsee ogni numero diverso da zero lo sia true. Ovviamente qui abbiamo il caso in cui Chris usa stringhe invece di numeri, quindi questo commento è solo parzialmente valido;)
Gacek

È sempre un dibattito. 0 significa anche ERROR_SUCCESS che significa che tutto è andato bene. Ma sono d'accordo con Gacek sul fatto che sia più naturale.
Pierre-Alain Vigeant

3
Non dimenticare di verificare la presenza di valori nulli:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore

2
perché non Convert.ToBoolean (1)? Fa lo stesso e stai usando il framework per il controllo. Mi piace anche la risposta sopra, ma quale è meglio usare?
user20358

105

In una singola riga di codice:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))

3
Mi piace la tua versione Chris perché, come affermato dalla domanda, usiamo booleano invece di confrontare le stringhe.
Svet

Preferisco anche la tua versione perché trasmette più chiaramente l'intento.
BornToCode

È corretto solo per "1" o "0". Per qualsiasi altra stringa il valore restituito non è deterministico, ad esempio "101" è vero e così via ...
szubajak

12

Se vuoi che la conversione abbia sempre successo, probabilmente il modo migliore per convertire la stringa sarebbe considerare "1"come truee qualsiasi altra cosa come false(come fa Kevin). Se desideri che la conversione fallisca se viene restituito qualcosa di diverso da "1"o "0", allora sarebbe sufficiente quanto segue (potresti metterlo in un metodo di supporto):

if (returnValue == "1")
{
    return true;
}
else if (returnValue == "0")
{
    return false;
}
else
{
    throw new FormatException("The string is not a recognized as a valid boolean value.");
}

Bella idea per cogliere il valore non riconosciuto. Non sono sicuro di voler andare in quel modo, ma è comunque una buona idea.
Chris

5

Imposta il tipo di ritorno su numerico - non hai bisogno di un carattere (quindi non usarlo); un valore numerico (0/1) può essere convertito con Convert.ToBoolean (num)

Altrimenti: usa la risposta di Kevin


Vorrei che potessimo cambiare il tipo di reso. Ma siamo bloccati su quello che è.
Chris

10
Convert.ToBooleanaccetta solo stringhe Vero / Vero / Falso / Falso
Yaro

5

Puoi usare quel modulo:

return returnValue.Equals("1") ? true : false;

O più semplicemente (grazie a Jurijs Kastanovs):

return returnValue.Equals("1");

7
Basta perdere il bit "? True: false". Non è assolutamente necessario. Lascialo a {return returnValue.Equals ("1")}
Jurijs Kastanovs,

2

Oppure, se il valore booleano non è stato restituito, puoi fare qualcosa del genere:

bool boolValue = (returnValue == "1");

1

La mia soluzione (vb.net):

Private Function ConvertToBoolean(p1 As Object) As Boolean
    If p1 Is Nothing Then Return False
    If IsDBNull(p1) Then Return False
    If p1.ToString = "1" Then Return True
    If p1.ToString.ToLower = "true" Then Return True
    Return False
End Function


-1

Se non vuoi convertire, usa;

 bool _status = status == "1" ? true : false;

Forse restituirai i valori come desideri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.