2016-09-12 3 views
5

Есть ли простой способ походить на таблицу истинности в коде? Он имеет 2 входа и 4 результаты, как показано ниже:Есть ли способ просто походить на таблицу истинности?

enter image description here

Мой текущий код:

private void myMethod(bool param1, bool param2) 
{ 
    Func<int, int, bool> myFunc; 
    if (param1) 
    { 
     if (param2) 
      myFunc = (x, y) => x >= y; 
     else 
      myFunc = (x, y) => x <= y; 
    } 
    else 
    { 
     if (param2) 
      myFunc = (x, y) => x < y; 
     else 
      myFunc = (x, y) => x > y; 
    } 
    //do more stuff 
} 
+3

Это называется «таблица истинности». –

+0

Возможно, вам захочется найти термин «машина состояния», так как кажется, что вы направляетесь в этом направлении. – Stefan

+0

Что случилось с вашей текущей реализацией? – slawekwin

ответ

5

Я предлагаю, используя массив, т.е.

// XOR truth table 
    bool[][] truthTable = new bool[][] { 
    new bool[] {false, true}, 
    new bool[] {true, false}, 
    }; 

...

private void myMethod(bool param1, bool param2, bool[][] table) { 
    return table[param1 ? 0 : 1][param2 ? 0 : 1]; 
    } 
+2

Вы не можете индексировать массивы с 'bool's – Lee

+0

@Lee: спасибо, я вижу (' C# 'не' C'), требуется оператор ternaty –

0
public int myTest(bool a, bool b) 
{ 
    if(!b) 
    return 3; 
    return a ? 1 : 2; 
} 
+0

Я считаю, что OP ищет более общее решение –

0

Чтобы упростить код, который вы могли бы использовать param1 и param2 в качестве битов индексации стоимости в заранее определенном массиве:

private void myMethod(bool param1, bool param2) 
{ 
    Func<int, int, bool>[] myFuncs = { 
     (x, y) => x > y, 
     (x, y) => x < y, 
     (x, y) => x <= y, 
     (x, y) => x >= y 
    }; 

    int index = (param1 ? 2 : 0) + (param2 ? 1 : 0); 
    Func<int, int, bool> myFunc = myFuncs[index]; 
    //do more stuff 
} 

Но, конечно же, простота и четкость в глазах читателя.

Если оба paramX являются false, index будет 0. Если оба являются true, index будет 3 и т. Д.

Смежные вопросы