2012-07-11 5 views
10

Zastanawiam się, czy to było możliwe, ponieważ zacząłem używać operatorów trójskładnikowych, aby zmniejszyć linie kodu i kocham je.Jak włączyć, jeśli logika do trójskładnikowego operatora?

if (x==y) 
{ 
    z += x; 
} else if (x==z) 
{ 
    z += y; 
} else { 
    z += 1; 
} 

mogę to zrobić teraz, jeśli istnieje tylko jeden if tak:

z = x == y ? z += x : z += 1; 
+17

"Zacząłem używać operatorów trójskładnikowych zmniejszyć linii kodu i jestem loving it" Uh oh. – BoltClock

+0

Cóż, jeśli istnieje tylko jedna instrukcja, można usunąć nawiasy klamrowe. I jest bardziej czytelny niż trójkowy. Imo – Maresh

+0

@BoltClock Zamiast tego mówić, czy możesz wyjaśnić, dlaczego to jest złe? Zawsze chętnie słucham. –

Odpowiedz

26

Byłoby tak:

z = 
    x == y ? z + x : 
    x == z ? z + y : 
    z + 1; 

Jeśli używasz z += x jako argumentu będzie w końcu robi z = (z += x). Chociaż działa w tym szczególnym przypadku, w wyniku wyrażenia z += x jest ostateczna wartość z, może nie działać w innych przypadkach.

Howver, ponieważ wszystkie operacje mają z += wspólnego, można zrobić tak:

z += 
    x == y ? x : 
    x == z ? y : 
    1; 

używać z ostrożnością, choć. Kod jest często czytelniejszy i łatwiejszy w utrzymaniu, tym prostszy jest, a zagnieżdżone operacje warunkowe nie są bardzo czytelne. Używaj tego również, gdy masz wyrażenie w wyniku operacji warunkowej, nie jest to zamiennik typu drop-in dla instrukcji if.

+0

Dzięki, to jest niesamowite! –

5

Można użyć

z += x == y ? x : x == z ? y : 1; 

Ale szczerze mówiąc, to naprawdę nie jest bardziej czytelny niż to, co miał wcześniej. Można zrobić to nieco wyraźniejsze, dodając nawiasach:

z += x == y ? x : (x == z ? y : 1); 

Ale ogólnie bym dala od zagnieżdżonych operatorów warunkowych chyba podczas gry w golfa.

+10

"Can". Ale proszę, nie rób tego. –

+0

Z pewnymi nowymi liniami, myślę, że to może być * bardziej * czytelne niż oryginał. – recursive

+0

Michael: Zgoda; dodano notatkę do tego. rekursywne: próbowałem po prostu sformatować to w wielu wierszach, ale nie udało mi się uczynić go bardziej zrozumiałym. Może po prostu ssam. Ale może złożone operatory warunkowe są trudne do sformatowania dla czytelności. – Joey

4

Cztery linie kodu i najbardziej czytelna, IMO. Nie ma potrzeby posiadania potrójnego operatora tutaj:

if (x == y || x == z) 
    z += y; 
else 
    z++;  

Gdybym miał napisać go za pomocą trójskładnikowych zrobiłbym:

z += (x == y || x == z) ? y : 1; 
+0

To nie jest to samo co ich kod źródłowy. –

+0

@AshBurlaczenko: Jaka jest różnica? – recursive

+0

@Ash Burlaczenko: Wykonuje się dokładnie w ten sam sposób. Nie ma sensu decydować, czy dodać "x" czy "y", jeśli oba mają być takie same, a jeśli nie, to dodajesz 'y' * w każdym razie *. – BoltClock

0

Aby włączyć obliczanie z w jednej linii, chciałbym zrobić coś takiego :

public int GetZBasedOnXY(int z, int x, int y) 
{ 
    // Chose this solution, but any can go in here and work. 
    if (x == y || x == z) 
     return z + y; 
    else 
     return z + 1; 
} 

Następnie:

z = GetZBasedOnXY(z, x, y); 

Bardziej czytelny, a jeśli nazewnictwo jest dobre, a metoda ma zasięg testu jednostkowego, jeszcze lepiej.

2

należy zrobić to za pomocą nawiasów tak:

(x==y)?(z+=x):((x==z)?(z+=y):(z+=1)) 
0

To proste, aby kontynuować operatora potrójnego niż jeśli else if warunek, tylko trzeba kontynuować to samo nawet po „:”. poniżej znajduje się próbka.

var result = a ? x : b ? y : z; 

Reference example