Jak przekonwertować „0” i „1” na fałsz i prawda

90

Mam metodę, która łączy się z bazą danych przez Odbc. Wywoływana przeze mnie procedura składowana ma wartość zwracaną, która po stronie bazy danych to „Char”. W tej chwili chwytam tę wartość zwracaną jako ciąg i używam jej w prostej instrukcji if. Naprawdę nie podoba mi się pomysł porównywania takiego ciągu, gdy tylko dwie wartości mogą wrócić z bazy danych, 0 i 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;
} 

Jaki byłby właściwy sposób rozwiązania tej sytuacji. Próbowałem `` Convert.ToBoolean () '', co wydawało się oczywistą odpowiedzią, ale natrafiłem na `` Ciąg nie został rozpoznany jako prawidłowy Boolean. 'wyjątek został wyrzucony. Czy coś mi tu brakuje, czy jest inny sposób, aby „1” i „0” zachowywały się jak prawda i fałsz?

Dzięki!

Chris
źródło

Odpowiedzi:

156

Co powiesz na:

return (returnValue == "1");

lub jak zasugerowano poniżej:

return (returnValue != "0");

Właściwy będzie zależał od tego, czego szukasz jako wyniku sukcesu.

kemiller2002
źródło
9
Poprawny? Czek; Zwięzły? Czek; Elegancki? Czek. +1.
Earlz
11
Polecam używanie return (returnValue!="0"). To byłoby bardziej naturalne, że 0jest false, a każdy numer, który nie jest zero true. Oczywiście mamy tutaj przypadek, w którym Chris używa ciągów znaków zamiast liczb, więc ten komentarz jest tylko częściowo ważny;)
Gacek
To zawsze jest debata. 0 oznacza również ERROR_SUCCESS, co oznacza, że ​​wszystko poszło dobrze. Ale zgadzam się z Gackiem, że jest to bardziej naturalne.
Pierre-Alain Vigeant
3
Nie zapomnij sprawdzić wartości null:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore
2
dlaczego nie Convert.ToBoolean (1)? Robi to samo i używasz ramy do sprawdzenia. Powyższa odpowiedź również mi się podoba, ale która z nich jest lepsza?
user20358
105

W jednej linii kodu:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
Chris
źródło
3
Podoba mi się twoja wersja Chris, ponieważ zgodnie z pytaniem użyjmy boolean zamiast porównywać łańcuchy.
Svet
Wolę też twoją wersję, ponieważ jaśniej oddaje intencje.
BornToCode
Odpowiednie tylko dla „1” lub „0”. Dla każdego innego ciągu wartość zwracana nie jest deterministyczna, na przykład „101” jest prawdą i tak dalej ...
szubajak
12

Jeśli chcesz konwersja zawsze uda, prawdopodobnie najlepszym sposobem przekonwertować ciąg byłoby rozważyć "1"jak truei cokolwiek innego jak false(podobnie jak Kevin). Jeśli chcesz, aby konwersja zakończyła się niepowodzeniem, jeśli zostanie zwrócona cokolwiek innego niż "1"lub "0", wystarczyłoby następujące (możesz umieścić to w metodzie pomocniczej):

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
źródło
Fajny pomysł, aby złapać nierozpoznaną wartość. Nie jestem pewien, czy chcę iść tą drogą, ale nadal dobry pomysł.
Chris
5

Ustaw typ powrotu na numeryczny - nie potrzebujesz znaku (więc nie używaj go); wartość liczbową (0/1) można przekonwertować za pomocą Convert.ToBoolean (num)

W przeciwnym razie: użyj odpowiedzi Kevina

riffnl
źródło
Chciałbym, żebyśmy mogli zmienić typ zwrotu. Ale utknęliśmy z tym, co to jest.
Chris
10
Convert.ToBooleanakceptuje tylko ciągi True / true / False / false
Yaro
4

Możesz skorzystać z tego formularza:

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

Lub prościej (dzięki Jurijsowi Kastanovsowi):

return returnValue.Equals("1");
Nuno Ribeiro
źródło
7
Po prostu zgub bit „? True: false”. To zupełnie niepotrzebne. Zostaw to na {return returnValue.Equals ("1")}
Jurijs Kastanovs
2

Lub jeśli wartość logiczna nie została zwrócona, możesz zrobić coś takiego:

bool boolValue = (returnValue == "1");
Pabinator
źródło
1

Moje rozwiązanie (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
źródło
-1
(returnValue != "1" ? false : true);
Amin AmiriDarban
źródło
-1

Jeśli nie chcesz konwertować, po prostu użyj;

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

Być może zwrócisz wartości, jak chcesz.

mzonerz
źródło