Como converter “0” e “1” em falso e verdadeiro

88

Eu tenho um método que está se conectando a um banco de dados via Odbc. O procedimento armazenado que estou chamando tem um valor de retorno que do lado do banco de dados é um 'Char'. Agora estou pegando esse valor de retorno como uma string e usando-o em uma instrução if simples. Eu realmente não gosto da ideia de comparar uma string como esta quando apenas dois valores podem retornar do banco de dados, 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;
} 

Qual seria a forma adequada de lidar com essa situação. Tentei 'Convert.ToBoolean ()', que parecia ser a resposta óbvia, mas encontrei a mensagem 'String não foi reconhecida como um Booleano válido. 'exceção sendo lançada. Estou faltando alguma coisa aqui ou há outra maneira de fazer '1' e '0' agirem como verdadeiro e falso?

Obrigado!

Chris
fonte

Respostas:

154

E se:

return (returnValue == "1");

ou conforme sugerido abaixo:

return (returnValue != "0");

O correto dependerá do que você está procurando como resultado de sucesso.

kemiller2002
fonte
9
Corrigir? Verifica; Conciso? Verifica; Elegante? Verifica. +1.
Earlz de
10
Eu recomendaria usar return (returnValue!="0"). Seria mais natural que 0seja falsee todo número que não seja zero o seja true. Claro, aqui temos o caso em que Chris usa strings em vez de números, então este comentário é apenas parcialmente válido;)
Gacek
É sempre um debate. 0 também significa ERROR_SUCCESS, o que significa que tudo correu bem. Mas concordo com Gacek que é mais natural.
Pierre-Alain Vigeant
3
Não se esqueça de verificar se há nulos:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore
2
por que não Convert.ToBoolean (1)? Ele faz o mesmo e você está usando a estrutura para a verificação. Também gostei da resposta acima, mas qual é a melhor para ser usada?
user20358,
104

Em uma única linha de código:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
Chris
fonte
3
Eu gosto da sua versão Chris porque, como afirma a pergunta, vamos usar booleano em vez de comparar strings.
Svet
Eu também prefiro sua versão porque ela transmite a intenção mais claramente.
BornToCode de
É adequado apenas para "1" ou "0". Para qualquer outra string, o valor de retorno não é determinístico, por exemplo "101" é verdadeiro e assim por diante ...
szubajak
12

Se você deseja que a conversão sempre seja bem-sucedida, provavelmente a melhor maneira de converter a string seria considerar "1"como truee qualquer outra coisa como false(como Kevin faz). Se você quiser que a conversão falhe se algo diferente de "1"ou "0"for retornado, o seguinte será suficiente (você pode colocá-lo em um 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
fonte
Boa ideia para capturar o valor não reconhecido. Não tenho certeza se quero ir por esse caminho, mas ainda é uma boa ideia.
Chris
5

Defina o tipo de retorno como numérico - você não precisa de um caractere (portanto, não o use); um valor numérico (0/1) pode ser convertido com Convert.ToBoolean (num)

Caso contrário: use a resposta de Kevin

riffnl
fonte
Eu gostaria que pudéssemos mudar o tipo de retorno. Mas estamos presos ao que é.
Chris,
9
Convert.ToBooleanaceita apenas strings Verdadeiro / verdadeiro / falso / falso
Yaro
4

Você pode usar esse formulário:

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

Ou mais simplesmente (graças a Jurijs Kastanovs):

return returnValue.Equals("1");
Nuno Ribeiro
fonte
6
Basta perder o bit "? True: false". É totalmente desnecessário. Deixe em {return returnValue.Equals ("1")}
Jurijs Kastanovs
2

Ou se o valor booleano não for retornado, você pode fazer algo assim:

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

Minha solução (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
fonte
-1
(returnValue != "1" ? false : true);
Amin AmiriDarban
fonte
-1

Se você não deseja converter.Basta usar;

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

Talvez você retorne os valores que deseja.

mzonerz
fonte