Cómo convertir "0" y "1" en falso y verdadero

90

Tengo un método que se conecta a una base de datos a través de Odbc. El procedimiento almacenado al que estoy llamando tiene un valor de retorno que desde el lado de la base de datos es un 'Char'. En este momento, estoy tomando ese valor de retorno como una cadena y lo uso en una simple declaración if. Realmente no me gusta la idea de comparar una cadena como esta cuando solo dos valores pueden regresar de la base de datos, 0 y 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;
} 

Cuál sería la forma adecuada de manejar esta situación. Probé 'Convert.ToBoolean ()', que parecía la respuesta obvia, pero me encontré con el 'String no fue reconocido como un booleano válido. 'excepción lanzada. ¿Me estoy perdiendo algo aquí, o hay otra forma de hacer que el '1' y el '0' actúen como verdadero y falso?

¡Gracias!

Chris
fuente

Respuestas:

156

Qué tal si:

return (returnValue == "1");

o como se sugiere a continuación:

return (returnValue != "0");

El correcto dependerá de lo que esté buscando como resultado de éxito.

kemiller2002
fuente
9
¿Correcto? Cheque; ¿Conciso? Cheque; ¿Elegante? Cheque. +1.
Earlz
11
Recomendaría usar return (returnValue!="0"). Sería más natural que así 0sea falsey todo número que no sea cero lo es true. Por supuesto, aquí tenemos el caso en el que Chris usa cadenas en lugar de números, por lo que este comentario es solo parcialmente válido;)
Gacek
Siempre es un debate. 0 también significa ERROR_SUCCESS, lo que significa que todo salió bien. Pero estoy de acuerdo con Gacek en que es más natural.
Pierre-Alain Vigeant
3
No olvide verificar si hay nulos:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore
2
¿por qué no Convert.ToBoolean (1)? Hace lo mismo y está utilizando el marco para la verificación. También me gusta la respuesta anterior, pero ¿cuál es mejor para usar?
user20358
105

En una sola línea de código:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
Chris
fuente
3
Me gusta su versión Chris porque, como se indica en la pregunta, usemos booleanos en lugar de comparar cadenas.
Svet
También prefiero tu versión porque transmite la intención con mayor claridad.
BornToCode
Es apropiado solo para "1" o "0". Para cualquier otra cadena, el valor de retorno no es determinista, por ejemplo, "101" es verdadero y así sucesivamente ...
szubajak
12

Si desea que la conversión siempre tenga éxito, probablemente la mejor manera de convertir la cadena sería considerar "1"como truey cualquier otra cosa como false(como hace Kevin). Si desea que la conversión falle si se devuelve algo que no sea "1"o "0", entonces lo siguiente sería suficiente (podría ponerlo en un método auxiliar):

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.");
}
Zach Johnson
fuente
Buena idea para captar el valor no reconocido. No estoy seguro de querer seguir ese camino, pero sigue siendo una buena idea.
Chris
5

Establezca el tipo de retorno en numérico: no necesita un carácter (así que no lo use); un valor numérico (0/1) se puede convertir con Convert.ToBoolean (num)

De lo contrario: use la respuesta de Kevin

riffnl
fuente
Ojalá pudiéramos cambiar el tipo de devolución. Pero estamos atrapados con lo que es.
Chris
10
Convert.ToBooleanacepta solo cadenas de verdadero / verdadero / falso / falso
Yaro
5

Puedes usar ese formulario:

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

O más simplemente (gracias a Jurijs Kastanovs):

return returnValue.Equals("1");
Nuno Ribeiro
fuente
7
Simplemente pierda el bit "? Verdadero: falso". Es totalmente innecesario. Déjelo en {return returnValue.Equals ("1")}
Jurijs Kastanovs
2

O si no se devuelve el valor booleano, puede hacer algo como esto:

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

Mi solución (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
user2241289
fuente
-1
(returnValue != "1" ? false : true);
Amin AmiriDarban
fuente
-1

Si no quieres convertir, solo usa;

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

Quizás devuelva los valores que desee.

mzonerz
fuente