Як перетворити "0" та "1" у хибне та істинне


90

У мене є метод, який підключається до бази даних через Odbc. Збережена процедура, яку я викликаю, має повернене значення, яке з боку бази даних є "Char". Зараз я захоплюю це повертане значення як рядок і використовую його у простому операторі if. Мені дуже не подобається ідея порівнювати такий рядок, коли з бази даних можуть повернутися лише два значення, 0 і 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;
} 

Яким буде правильний спосіб вирішення цієї ситуації. Я спробував "Convert.ToBoolean ()", що здавалося очевидною відповіддю, але я наткнувся на "Рядок не був визнаний дійсним булевим значенням. 'виняток. Мені чогось тут не вистачає, чи є інший спосіб змусити "1" та "0" поводитися як істинно та хибно?

Дякую!

Відповіді:


155

Як на рахунок:

return (returnValue == "1");

або як запропоновано нижче:

return (returnValue != "0");

Правильний залежатиме від того, що ви шукаєте як результат успіху.


9
Правильно? Перевірка; Стислий? Перевірка; Елегантний? Перевірте. +1.
Earlz,

11
Я б рекомендував використовувати return (returnValue!="0"). Було б більш природно, що 0є, falseі кожне число, яке не дорівнює нулю, є true. Звичайно, тут ми маємо випадок, коли Кріс використовує рядки замість цифр, тому цей коментар справедливий лише частково;)
Гачек

Це завжди суперечки. 0 також означає ERROR_SUCCESS, що означає, що все пройшло добре. Але я погоджуюся з Гацеком, що це більш природно.
Pierre-Alain Vigeant

3
Не забудьте перевірити наявність нулів:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore

2
чому не Convert.ToBoolean (1)? Він робить те саме, і ви використовуєте фреймворк для перевірки. Мені також подобається відповідь вище, але яку з них краще використовувати?
user20358

105

В одному рядку коду:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))

3
Мені подобається ваша версія Кріс, оскільки, як було сказано в запитанні, давайте використовувати логічну форму замість порівняння рядків.
Світ

Я також віддаю перевагу вашій версії, оскільки вона чіткіше передає намір.
BornToCode

Він підходить лише для "1" або "0". Для будь-якого іншого рядка значення, що повертається, не є детермінованим, наприклад, "101" є істинним і так далі ...
szubajak

12

Якщо ви хочете, щоб перетворення завжди було успішним, напевно найкращим способом перетворення рядка було б розглядати "1"як trueі будь-що інше як false(як це робить Кевін). Якщо ви хотіли, щоб перетворення не вдалося, якщо щось інше, ніж "1"або "0"повернуто, було б достатньо наступного (ви можете помістити це в допоміжний метод):

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

Приємна ідея зловити невизнану вартість. Не впевнений, що хочу йти цим шляхом, але все ж хороша ідея.
Кріс,

5

Встановіть тип повернення як числовий - вам не потрібен символ (тому не використовуйте його); числове значення (0/1) можна перетворити за допомогою Convert.ToBoolean (num)

В іншому випадку: використовуйте відповідь Кевіна


Я бажаю, щоб ми могли змінити тип повернення. Але ми застрягли в тому, що це таке.
Кріс,

10
Convert.ToBooleanприймає лише рядки True / true / False / false
Yaro

4

Ви можете використовувати цю форму:

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

Або простіше (завдяки Юрію Кастанову):

return returnValue.Equals("1");

7
Просто втратьте біт "? True: false". Це абсолютно непотрібно. Залиште це на {return returnValue.Equals ("1")}
Юрій Кастанов

2

Або якщо булеве значення не повертається, ви можете зробити щось подібне:

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

1

Моє рішення (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

Якщо ви не хочете конвертувати. Просто використовуйте;

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

Можливо, ви повернете значення як завгодно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.