С# Если нет (это) Или (это) или (это) - Множественное условие IF/OR

У меня есть такое состояние:

 if (!(InRange1 || InRange2 || InRange3))
{
//Do Something
}

Каждая из переменных InRange является логическим значением.

Желаемое поведение: если какое-либо из этих значений имеет значение False, я хочу что-то сделать, но это не работает. Все значения должны быть ложными до запуска события.

Нужно ли писать так

if (!InRange1 || !InRange2 || !InRange3)
{
//do something
}

И в любом случае мне любопытно, почему исходное утверждение не работает.


person bairdmar    schedule 19.09.2016    source источник
comment
А вы пробовали второй способ? Это сработало? Если это сработало, это правильный путь. Если вы не пробовали, попробуйте. Первоначальный оператор потерпел неудачу, потому что он делает именно то, что говорит: x = (a || b || c); return not x;. Всегда разбивайте сложные выражения на отдельные строки, так их гораздо легче уложить в голове. (альтернатива - заучивание имен мертвых логиков в верблюжьей оболочке, что не является выгодным использованием вашего времени)   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 19.09.2016
comment
Ну да - ваш первый фрагмент в основном выясняет, верно ли какое-либо из них, и инвертирует этот результат. Очень важно понять, почему это так. Посмотрите на выражение (InRange1 || InRange2 || InRange3)... что вы ожидаете от него в разных случаях? Затем помните, что вы инвертируете его с помощью !... но вы инвертируете весь результат.   -  person Jon Skeet    schedule 19.09.2016
comment
Когда вы ставите ! перед скобками вот так, вы говорите negate everything that is inside the parenthesis. Таким образом, все, что в этих скобках было true, становится false и наоборот.   -  person Lews Therin    schedule 19.09.2016
comment
Другой связанный вопрос: Обратить логику двух " или» в JavaScript, если запрос (это касается JavaScript, но логическая логика такая же)   -  person poke    schedule 19.09.2016
comment
Эти описания имеют смысл. Спасибо за разъяснения.   -  person bairdmar    schedule 19.09.2016


Ответы (2)


Для этого можно использовать Закон ДеМоргана.

То, что у вас есть, эквивалентно NOR. !(A | B | C) эквивалентно !A & !B & !C по закону ДеМоргана.

То, что вам нужно, это NAND, поэтому !(A && B && C). Это точно эквивалентно тому, что вы ищете - !A | !B | !C.

person EJoshuaS - Reinstate Monica    schedule 19.09.2016
comment
Отличное лаконичное описание. Спасибо. - person bairdmar; 19.09.2016
comment
@bairdmar рад, что смог помочь - person EJoshuaS - Reinstate Monica; 19.09.2016

Ваше второе предположение верно.

Взгляните на булева алгебра и Закон де Моргана.

Вы можете написать это not(A) OR not(B) or not(C) или not(A AND B AND C).

So

if (!(InRange1 && InRange2 && InRange3))
{
    //Do Something
}

а также

if (!InRange1 || !InRange2 || InRange3)
{
    //Do Something
}

эквивалентны.

person Markus Weninger    schedule 19.09.2016