Comment convertir «0» et «1» en faux et vrai

90

J'ai une méthode qui se connecte à une base de données via Odbc. La procédure stockée que j'appelle a une valeur de retour qui du côté de la base de données est un «Char». En ce moment, je saisis cette valeur de retour sous forme de chaîne et je l'utilise dans une simple instruction if. Je n'aime vraiment pas l'idée de comparer une chaîne comme celle-ci alors que seules deux valeurs peuvent revenir de la base de données, 0 et 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;
} 

Quelle serait la bonne façon de gérer cette situation. J'ai essayé 'Convert.ToBoolean ()' qui semblait être la réponse évidente mais j'ai rencontré le 'String n'a pas été reconnu comme un booléen valide. 'exception étant levée. Est-ce que je manque quelque chose ici, ou y a-t-il une autre façon de faire en sorte que «1» et «0» agissent comme vrai et faux?

Merci!

Chris
la source

Réponses:

156

Que diriez-vous:

return (returnValue == "1");

ou comme suggéré ci-dessous:

return (returnValue != "0");

Le bon dépendra de ce que vous recherchez comme résultat de réussite.

kemiller2002
la source
9
Correct? Vérifier; Concis? Vérifier; Élégant? Vérifier. +1.
Earlz
11
Je recommanderais d'utiliser return (returnValue!="0"). Il serait plus naturel 0est falseet chaque nombre est non nul est true. Bien sûr, nous avons ici le cas où Chris utilise des chaînes au lieu de nombres, donc ce commentaire n'est que partiellement valide;)
Gacek
C'est toujours un débat. 0 signifie également ERROR_SUCCESS ce qui signifie que tout s'est bien passé. Mais je suis d'accord avec Gacek pour dire que c'est plus naturel.
Pierre-Alain Vigeant
3
N'oubliez pas de vérifier les valeurs nulles:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore
2
pourquoi pas Convert.ToBoolean (1)? Il fait la même chose et vous utilisez le cadre pour le contrôle. J'aime aussi la réponse ci-dessus, mais laquelle est la meilleure à utiliser?
user20358
105

En une seule ligne de code:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
Chris
la source
3
J'aime votre version Chris parce que, comme la question l'a indiqué, utilisons booléen au lieu de comparer des chaînes.
Svet
Je préfère également votre version car elle exprime plus clairement l'intention.
BornToCode
Ce n'est approprié que pour "1" ou "0". Pour toute autre chaîne, la valeur de retour n'est pas déterministe, par exemple "101" est vrai et ainsi de suite ...
szubajak
12

Si vous voulez que la conversion réussisse toujours, le meilleur moyen de convertir la chaîne serait probablement de considérer "1"comme trueet n'importe quoi d'autre comme false(comme le fait Kevin). Si vous vouliez que la conversion échoue si autre chose que "1"ou "0"est retourné, alors ce qui suit suffirait (vous pouvez le mettre dans une méthode d'assistance):

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
la source
Bonne idée pour attraper la valeur non reconnue. Je ne suis pas sûr de vouloir suivre cette voie, mais c'est toujours une bonne idée.
Chris
5

Définissez le type de retour sur numérique - vous n'avez pas besoin d'un caractère (donc ne l'utilisez pas); une valeur numérique (0/1) peut être convertie avec Convert.ToBoolean (num)

Sinon: utilisez la réponse de Kevin

riffnl
la source
Je souhaite que nous puissions changer le type de retour. Mais nous sommes coincés avec ce que c'est.
Chris
10
Convert.ToBooleanaccepte uniquement les chaînes Vrai / Vrai / Faux / Faux
Yaro
5

Vous pouvez utiliser ce formulaire:

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

Ou plus simplement (grâce à Jurijs Kastanovs):

return returnValue.Equals("1");
Nuno Ribeiro
la source
7
Perdez simplement le bit "? True: false". C'est totalement inutile. Laissez-le à {return returnValue.Equals ("1")}
Jurijs Kastanovs
2

Ou si la valeur booléenne n'est pas renvoyée, vous pouvez faire quelque chose comme ceci:

bool boolValue = (returnValue == "1");
Pabinator
la source
1

Ma solution (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
la source
-1
(returnValue != "1" ? false : true);
Amin AmiriDarban
la source
-1

Si vous ne voulez pas convertir, utilisez simplement;

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

Vous retournerez peut-être les valeurs comme vous le souhaitez.

mzonerz
la source