Должно быть простой вопрос для экспертов C # здесь.
Я в основном хочу проверить, является ли одно или другое значение ИСТИНОЙ, дикий удар в коде ниже:
if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))
{
// is true
}
Это правильно?
Спасибо
Если ТОЧНО ОДИН должен быть истинным, то это:
var male = bool.Parse(staff.getValue("Male"));
var female = bool.Parse(staff.getValue("Female"));
if (male ^ female)
{
//is true
}
Похоже, вы ищете логическое ИЛИ.
if(condition1 || condition2)
{
}
Используйте ||
(двойной канал), логическое ИЛИ.
bool isMale = Boolean.Parse(staff.getValue("Male");
bool isFemale = Boolean.Parse(staff.getValue("Female");
if (isMale || isFemale) // note double pipe ||
{
// do something if true
}
В C # выражения операторов вычисляются слева направо. В операции ИЛИ второе выражение не будет оцениваться, если первое равно истине.
Оператор условного ИЛИ ||
- это то, что вам нужно
if ((Boolean.Parse(staff.getValue("Male")) || Boolean.Parse(staff.getValue("Female")))
{
//is true
}
Если первое условие ИСТИНА
, то второе условие не выполняется. Не проверено, так как результат явно вернет ИСТИНА
.
Обратите внимание, что TryParse
работает быстрее и безопаснее, чем просто Parse
, потому что не выбрасывает исключение в случае ошибки. TryParse
возвращает bool, который показывает, был ли разбор успешным или нет.
Поэтому оба метода парсинга должны возвращать true
и только после этого делать главную проверку
bool male, female;
if ((Boolean.TryParse(staff.getValue("Male"), out male) &&
Boolean.TryParse(staff.getValue("Female"), out female)) &&
(male || female)) // or ^
{
// do stuff
}
или
bool male, female;
if (Boolean.TryParse(staff.getValue("Male"), out male) &&
Boolean.TryParse(staff.getValue("Female"), out female))
{
if(male) { }
else if (female) { } // or just else
}
else
{
// staff contains wrong data. Probably "yeap" instead of "true"
}
В любом случае необходима небольшая проверка исключений. Метод Boolean.Parse() получает строку в качестве аргумента и возвращает либо true
либо false
только если аргумент, очищенный от пробелов, равен "True" или "False" (обратите внимание на капитализацию). В ЛЮБОМ другом случае функция возвращает исключение.
Предположим, что возможными значениями staff.getValue("Male")
и staff.getValue("Female")
являются именно эти два, тогда достаточно простой дизъюнкции (||
). Если возможно любое другое возвращаемое значение, включая null
и пустую строку, то нужно проверить исключения
bool isMale;
try {
isMale = Boolean.Parse(staff.getValue("Male"));
} catch(Exception e) {
isMale = Boolean.False;
}
try {
isFemale = Boolean.Parse(staff.getValue("Female"));
} catch(Exception e) {
isFemale = Boolean.False;
}
if (isMale || isFemale) // note double pipe ||
{
// do something if true
}
или сравнить вручную
bool isMale = Boolean.TrueValue == staff.getValue("Male");
bool isFemale = Boolean.TrueValue == staff.getValue("Female");
if (isMale || isFemale) // note double pipe ||
{
// do something if true
}
Чтобы указать, указан ли пол со значением «истина», а не «ложь»,
bool genderIsSpecified = staff.getValue("Male") | staff.getValue("Female");
.. будет определять только то, является ли это одним из этих значений, а не какое из этих значений объект staff
есть.
Итак, на всякий случай, этот вопрос является буквальным, а не абстрактным примером ...
Мужчина или женщина ... каждый - один или другой. Возможно, в своем вопросе вы хотели спросить, какой из двух случаев? В этом случае
bool defaultGenderIfNoGenderDocumented = true; // male
bool MaleIfTrue_FemaleIfFalse = !string.IsNullOrEmpty(staff.getValue("Male"))
? bool.Parse(staff.getValue("Male"))
: string.IsNullOrEmpty(staff.getValue("Female"))
? bool.Parse(staff.getValue("Female"))
? false
: defaultGenderIfNoGenderDocumented
: defaultGenderIfNoGenderDocumented;
Или просто
// assume value is properly populated, ignore "Female" value
bool isMale = bool.Parse(staff.getValue("Male"));