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!

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.


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))

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.");
}

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


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");

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");

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


-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.