Как преобразовать «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» действовать как истина или ложь?

Благодаря!

Крис
источник

Ответы:

157

Как насчет:

return (returnValue == "1");

или как предложено ниже:

return (returnValue != "0");

Правильный вариант будет зависеть от того, что вы ищете в результате успеха.

kemiller2002
источник
9
Верный? Проверьте; Лаконично? Проверьте; Элегантный? Проверьте. +1.
Earlz
12
Я бы рекомендовал использовать return (returnValue!="0"). Было бы более естественно , что 0есть , falseи каждый номер, не ноль true. Конечно, здесь у нас есть случай, когда Крис использует строки вместо чисел, так что этот комментарий верен только частично;)
Гацек
Это всегда споры. 0 также означает ERROR_SUCCESS, что означает, что все прошло хорошо. Но я согласен с Гацеком, что это более естественно.
Пьер-Ален Вижан,
3
Не забудьте проверить наличие нулей:! String.IsNullOrEmpty (returnValue) && (returnValue == "1")
csharpforevermore
2
почему не Convert.ToBoolean (1)? Он делает то же самое, и вы используете фреймворк для проверки. Мне тоже нравится ответ выше, но какой из них лучше использовать?
user20358
107

В одной строке кода:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
Крис
источник
3
Мне нравится ваша версия, Крис, потому что, как указано в вопросе, позволяет использовать логическое значение вместо сравнения строк.
Svet
Я также предпочитаю вашу версию, потому что она более четко передает намерение.
BornToCode
Подходит только для «1» или «0». Для любой другой строки возвращаемое значение не является детерминированным, например "101" истинно и так далее ...
szubajak
12

Если вы хотите, чтобы преобразование всегда было успешным, вероятно, лучший способ преобразовать строку - это рассматривать "1"as 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
5

Вы можете использовать эту форму:

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
user2241289
источник
-1
(returnValue != "1" ? false : true);
Амин АмириДарбан
источник
-1

Если вы не хотите конвертировать, просто используйте;

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

Возможно, вы вернете значения как хотите.

mzonerz
источник