2013-04-09 9 views
8

Mam 3 wartości logiczne na moim kodzie (C#) i właściwości int32, która zależy od wartości boolowskich true i false. Co najlepszym sposobem do osiągnięcia tego celu w inny sposób niż w przypadku stwierdzenia typu:Najlepszym sposobem sprawdzenia wielu warunków logicznych w C#, jeśli instrukcje

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

EDIT: 3 booleans musi mieć każdą możliwą kombinację, aby ustawić wartość Int32.

EDYCJA 2: Wartość "d" może być taka sama dla dwóch różnych porównań boolean.

+4

Jeśli nie zawsze są dokładnie trzy wartości logiczne, można zbudować stolik z wyprzedzeniem, a potem po prostu wyszukać konkretną pozycję, korzystając z wartości logicznych jak klucze. – cdhowie

+0

Tablica liczb całkowitych, a następnie 3 wartości logiczne używane jako pojedyncze bity do indeksowania właściwego wpisu. Rodzaj kompaktowej reprezentacji drzewa binarnego. –

+0

Do EDYCJI: moja odpowiedź pokazuje, jak obliczyć "indeks kombinacyjny" z warunków składowych – sehe

Odpowiedz

25

Jest lepiej uchwycić intencje operacji zamiast jawnie sprawdzić wartości logicznych .

Na przykład:

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

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

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

+1 Zdecydowanie się zgadzam, w zależności od tego, który z nich jest najbardziej zwartym sposobem sprawdzenia warunków, o których nie powinniśmy zapominać. –

+0

+1 także tutaj. Wciąż napisałem odpowiedź, ponieważ z PO nie wynika, że ​​jego scenariusz nadaje się do "opisowej nazwy domeny". – sehe

+1

Jeśli chce zrobić zwięzły kod tego rodzaju, pokonuje cel – SamFisher83

2

Można zrobić wskazówkę tabeli przeglądowej podane przez @Adriano, zakładając, że masz lookup_table wypełnione wartościami dla indeksu [0..8):

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

int d = lookup_table[index]; 

Edit EDIT w rachubę uczynił to nieistotnym: Co to znaczy?

Jeśli jest to liczba fałszywych wartości (możliwe od przykładowego kodu), sprawiają, że

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

2

myślę co robisz teraz jest idealnie czysty i wszelkie inne rozwiązania byłyby w dół do preferencji.

Moja preferencja, w przypadku gdy ma zastosowanie, to oddzielenie czeków, jeśli to możliwe.

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

Byłoby to przydatne w przypadku, gdy trzeba sprawdzić pewne prereqs przed wydaniem funkcję, jak gdyby użytkownik zalogowany, jeżeli parametr istnieje i jest w odpowiednim kontekście, wraz z innymi przedmiotami.

jakbym powiedział to może nie mieć zastosowania, ale ja po prostu chciałem wyrazić moje zdanie

0

nie widzę niczego złegoz tym, jak to robisz, ale jeśli wyjście jest taki sam dla wiele warunków, które możesz może być w stanie uprościć, tworząc tabelę prawdy i upraszczając warunki.

Na przykład, jeśli d powinny być 0każdej chwilia jest fałszywa można uprościć do:

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

Albo czy istnieje jakiś matematyczny wzór (np a, b, a c reprezentują trzy cyfry liczba binarna), wtedy możesz zrobić bitową arytmetykę.

Jeśli jednak masz 8 odrębne wyników (po jednym dla każdej kombinacji a, b i c), wówczas metoda jest w porządku.

9

Możesz użyć mapy Karnaugha, aby zredukować swoje równania i mieć mniej ifs.

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

+0

To najlepsze rozwiązanie Jestem zszokowany, dlatego wielu ludzi tego nie sugerowało. –

+1

@Ramhound wiele osób po prostu woli pisać logikę, jeśli się pojawi, a nie jak skutecznie kombinuje, ostatecznie; K-mapy koncentrują się na wyniku _właściwie_ i bezwzględnie eliminują wszelkie informacje z wejścia, które nie wpływają już na wynik. Ta informacja nie jest już widoczna ze źródła. Hene, źródło nie jest już odbiciem wymagań funkcjonalnych. To jest trudne, aby udowodnić słuszność, a nie, że jest to łatwiejsze. Jeszcze trudniejsze w utrzymaniu (modyfikacja). Zamiast tego zazwyczaj powinieneś pozwolić kompilatorowi martwić się o optymalizację (co może się zdarzyć nawet po wstawieniu). – sehe