Wie man "0" und "1" in falsch und wahr umwandelt

87

Ich habe eine Methode, die über Odbc eine Verbindung zu einer Datenbank herstellt. Die gespeicherte Prozedur, die ich aufrufe, hat einen Rückgabewert, der von der Datenbankseite ein 'Char' ist. Im Moment greife ich diesen Rückgabewert als Zeichenfolge und verwende ihn in einer einfachen if-Anweisung. Die Idee, einen solchen String zu vergleichen, gefällt mir wirklich nicht, wenn nur zwei Werte aus der Datenbank zurückkehren können, 0 und 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;
} 

Was wäre der richtige Weg, um mit dieser Situation umzugehen? Ich habe 'Convert.ToBoolean ()' ausprobiert, was die offensichtliche Antwort zu sein schien, aber ich bin auf den 'String wurde nicht als gültiger Boolescher Wert erkannt. 'Ausnahme wird geworfen. Vermisse ich hier etwas oder gibt es eine andere Möglichkeit, '1' und '0' wie wahr und falsch wirken zu lassen?

Vielen Dank!

Chris
quelle

Antworten:

153

Wie wäre es mit:

return (returnValue == "1");

oder wie unten vorgeschlagen:

return (returnValue != "0");

Die richtige hängt davon ab, wonach Sie als Erfolgsergebnis suchen.

kemiller2002
quelle
9
Richtig? Prüfen; Prägnant? Prüfen; Elegant? Prüfen. +1.
Earlz
10
Ich würde empfehlen, zu verwenden return (returnValue!="0"). Es wäre natürlich , dass 0ist falseund jede Zahl , die nicht Null ist true. Natürlich haben wir hier den Fall, dass Chris Strings anstelle von Zahlen verwendet, daher ist dieser Kommentar nur teilweise gültig;)
Gacek
Es ist immer eine Debatte. 0 bedeutet auch ERROR_SUCCESS, was bedeutet, dass alles gut gelaufen ist. Aber ich stimme Gacek zu, dass es natürlicher ist.
Pierre-Alain Vigeant
3
Vergessen Sie nicht, nach Nullen zu suchen :! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore
2
warum nicht Convert.ToBoolean (1)? Dies geschieht auch, und Sie verwenden das Framework für die Prüfung. Ich mag die obige Antwort auch, aber welche ist besser zu verwenden?
user20358
104

In einer einzigen Codezeile:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
Chris
quelle
3
Ich mag deine Version Chris, weil wir, wie in der Frage angegeben, Boolesche Werte verwenden können, anstatt Zeichenfolgen zu vergleichen.
Svet
Ich bevorzuge auch Ihre Version, weil sie die Absicht klarer vermittelt.
BornToCode
Es ist nur für "1" oder "0" geeignet. Für jeden anderen String ist der Rückgabewert nicht deterministisch, zum Beispiel ist "101" wahr und so weiter ...
szubajak
12

Wenn Sie möchten, dass die Konvertierung immer erfolgreich ist, ist es wahrscheinlich der beste Weg, die Zeichenfolge zu konvertieren, "1"als trueund alles andere als false(wie Kevin) zu betrachten. Wenn Sie möchten, dass die Konvertierung fehlschlägt, wenn etwas anderes als "1"oder "0"zurückgegeben wird, reicht Folgendes aus (Sie können es in eine Hilfsmethode einfügen):

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
quelle
Gute Idee, den nicht erkannten Wert zu fangen. Ich bin mir nicht sicher, ob ich diesen Weg gehen möchte, aber trotzdem eine gute Idee.
Chris
5

Setzen Sie den Rückgabetyp auf numerisch - Sie benötigen kein Zeichen (verwenden Sie es also nicht). Ein numerischer Wert (0/1) kann mit Convert.ToBoolean (num) konvertiert werden.

Ansonsten: benutze Kevins Antwort

riffnl
quelle
Ich wünschte, wir könnten den Rückgabetyp ändern. Aber wir bleiben bei dem, was es ist.
Chris
9
Convert.ToBooleanakzeptiert nur True / True / False / False Strings
Yaro
4

Sie können dieses Formular verwenden:

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

Oder einfacher (danke an Jurijs Kastanovs):

return returnValue.Equals("1");
Nuno Ribeiro
quelle
6
Verliere einfach das "? True: false" -Bit. Es ist völlig unnötig. Lassen Sie es bei {return returnValue.Equals ("1")}
Jurijs Kastanovs
2

Wenn der Boolesche Wert nicht zurückgegeben wird, können Sie Folgendes tun:

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

Meine Lösung (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
quelle
-1
(returnValue != "1" ? false : true);
Amin AmiriDarban
quelle
-1

Wenn Sie nicht konvertieren möchten. Verwenden Sie einfach;

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

Vielleicht geben Sie die Werte wie gewünscht zurück.

mzonerz
quelle