2009-08-27 17 views
11

Hej wszystkim, patrząc na zmniejszenie kodu na moje instrukcje C#, ponieważ jest kilka powtarzających się czynników i zastanawiałem się, czy możliwe jest rozwiązanie do przycinania.JEŻELI Wyrażenie wiele warunków, to samo oświadczenie

Mam obecnie 2 instrukcje if, które muszą wykonać identyczne oświadczenie, jednak jedyną zmienną jest dodatkowy warunek instrukcji if, gdy pole wyboru nie jest zaznaczone. Im po prostu zastanawiasz się, czy istnieje sposób, aby uczynić go jednym oświadczenia lub uczynić zmienną warunek ciąg, heres skompresowanej wersji kodu:

if (checkbox.checked) 
    { 
    if (columnname != a && columnname != b && columnname != c) 
    { 
     "statement 1" 
    } 
    } 
else 
    { 
    if (columnname != a && columnname != b && columnname != c 
     && columnname != A2) 
    { 
     "statement 1" 
    } 
    } 

jej jak trzeba uruchomić if wewnątrz warunków if stwierdzenie, czy to ma sens, jak tego formularza psuedo:

if (columnname != a 
    && columnname != b 
    && columnname != c 
    && if(checkbox.checked{columnname != A2}) 
+0

BTW - T ta sama odpowiedź działa w językach C, C++ i Java. –

Odpowiedz

33
if (columnname != a 
    && columnname != b 
    && columnname != c 
    && (checkbox.checked || columnname != A2)) 
{ 
    "statement 1" 
} 

powinno załatwić sprawę.

+3

zwykle, gdy moje warunki w instrukcjach if są więcej niż trzy, wyodrębniam je do metody prywatnej, aby wyjaśnić, jaki jest warunek –

10
if (columnname != a && columnname != b && columnname != c 
     && (columnname != A2 || checkbox.checked)) 
    { 
     "statement 1" 
    } 
0
if (checkbox.checked && columnname != a && columnname != b && columnname != c) 
    { 
     "statement 1" 
    } 
else if (columnname != a && columnname != b && columnname != c 
     && columnname != A2) 
    { 
     "statement 1" 
    } 

jest jednym ze sposobów na uproszczenie.

3

Czy to nie jest ten sam:

if ((checkbox.checked || columnname != A2) && 
     columnname != a && columnname != b && columnname != c) 
    { 
     "statement 1" 
    } 
2

Można też to zrobić, jeśli uważasz, że jest to bardziej oczywiste:

if (columnname != a 
    && columnname != b 
    && columnname != c 
{ 
    if (checkbox.checked || columnname != A2) 
    { 
     "statement 1" 
    } 
} 
1

myślę agileguy ma poprawną odpowiedź, ale chciałbym dodać, że w trudniejszych sytuacjach istnieje kilka strategii, które podejmuję, aby rozwiązać problem. Pierwszym z nich jest użycie truth table. Jeśli Google "tabelę prawdy" przejdzie przez kilka przykładów związanych bezpośrednio z programowaniem i informatyką.

Inną strategią, którą stosuję, jest użycie anonimowej funkcji do enkapsulacji wspólnej logiki między różnymi warunkami. Utwórz go tuż przed blokiem if, a następnie użyj go w razie potrzeby. Wydaje się, że tworzy to kod, który jest bardziej czytelny i łatwiejszy w utrzymaniu.

6

Zawsze staram się czynnik poza złożonych wyrażeń logicznych w zmiennych sensownych (prawdopodobnie można by było pomyśleć o lepszych nazw opartych na co te kolumny są wykorzystywane do):

bool notColumnsABC = (columnname != a && columnname != b && columnname != c); 
bool notColumnA2OrBoxIsChecked = (columnname != A2 || checkbox.checked); 

if ( notColumnsABC 
    && notColumnA2OrBoxIsChecked) 
    { 
     "statement 1" 
    } 
3

dość stare pytanie, ale sprawdzić to na bardziej skupione sposobem sprawdzania warunków:

private bool IsColumn(string col, params string[] names) => names.Any(n => n == col); 

wykorzystanie:

private void CheckColumn() 
{ 
    if(!IsColumn(ColName, "Column A", "Column B", "Column C")) 
    { 
    //not A B C column 
    } 

} 
Powiązane problemy