Лучший способ проверить несколько булевых условий в операторах c# if

у меня есть 3 логических значения в моем коде (C#) и int32 свойство, которое зависит от того, какие логические значения true и false. Каков наилучший способ сделать это по-другому, чем если бы такие утверждения, как:

if(a && b && !c)
   d = 1;
if(a && !b && !c)
   d = 2;
//etc.. ect...

EDIT: 3 логических значения должны иметь все возможные комбинации для установки значения int32.

EDIT 2: значение " d " может быть одинаковым для двух разных булевых сравнений.

5 ответов


лучше захватить намерение операции, а не явно проверять логические значения.

например:

public void Check()
{
   if (HasOrdered())
   {
      // do logic
   }
}

private bool HasOrdered()
{
    return a && !b && !c;
}

private bool HasBooked()
{
    return a && b && !c;
}

вы можете использовать карту Карно, чтобы уменьшить свои уравнения и иметь меньше ifs.

https://en.wikipedia.org/wiki/Karnaugh_map


Я думаю, что то, что вы делаете сейчас, прекрасно, и любые другие решения будут сводиться к предпочтениям.

мое предпочтение, где это применимо, было бы разделить проверки, если это возможно.

 if (!a)
    return;
 if (!b)
    return;
 if (!c)
    return;

Это было бы полезно в случае, если вам нужно проверить определенные предварительные условия Перед выдачей функции, например, если пользователь вошел в систему, если параметр существует и находится в правильном контексте вместе с другими элементами.

как я уже сказал, это может не относиться но я просто хотел высказать свое мнение


вы можете сделать подсказку таблицы поиска, данную @Adriano, предполагая, что у вас есть lookup_table заполнено значениями для index [0..8):

var index = new [] { a,b,c }.Aggregate(0, (a,i) => return 2*a + (i?1:0));

int d = lookup_table[index];

редактировать редактирование вопроса сделало это неуместным:что означает d?

Если это количество ложных значений (возможно из примера кода), сделайте это

int d = new [] { a,b,c }.Count(b => !b);


Я ничего не вижу неправильно С тем, как вы это делаете, но если выход одинаковый для нескольких условий, вы мая можно упростить, если путем создания таблицы истинности и упрощения условий.

например, если d должно быть 0 в любое время a - "ложь" можно упростить до:

if(a) 
   if(b && !c)
       d = 1;
   if(!b && !c)
       d = 2;
   ...
else
    d = 0;

или если есть какой-то математический шаблон (например,a, b и c представлять три цифры двоичного числа), то вы могли бы сделать бит арифметики.

Если, однако, у вас есть 8 distinct результатов (по одному для каждой комбинации a, b и c), то ваш метод хорош.