2012-07-11 7 views
10

Мне просто интересно, возможно ли это, потому что я начал использовать тернарные операторы для сокращения строк кода, и я люблю его.Как включить if, иначе если логика в тернарный оператор?

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

я могу сделать это сейчас, если есть только один, если заявление, как это:

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

«я начал использовать тройные операторы для уменьшения строк коды, и я люблю его» Ой-ой. – BoltClock

+0

Ну, если есть только одна инструкция, вы можете удалить фигурные скобки. И это более читаемо, чем троичный. Imo – Maresh

+0

@BoltClock Вместо того, чтобы просто сказать это, вы можете объяснить, почему это плохо? Я всегда готов слушать. –

ответ

26

Было бы так:

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

Если вы используете z += x в качестве операнда он будет в конечном итоге делает z = (z += x). Хотя он работает в этом специальном случае, в результате выражения z += x является конечным значением z, он может не работать в других случаях.

Howver, так как все операции имеют z += в общем, вы можете сделать так:

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

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

+0

Спасибо, это здорово! –

5

Вы можете использовать

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

Но если честно, это на самом деле не более читаемым, чем вы раньше. Вы можете сделать это немного яснее, добавляя скобки:

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

Но в целом я бы держаться подальше от вложенных условных операторов, если когда не играть в гольф.

+10

«Can». Но, пожалуйста, не надо. –

+0

С некоторыми разумными переводами строк, я думаю, что это может быть * более читаемым, чем оригинал. – recursive

+0

Michael: Согласен; добавила к этому записку. Рекурсивный: я просто попытался форматировать его по нескольким строкам, но не смог сделать его более понятным. Может быть, я просто сосать. Но, возможно, сложные условные операторы трудно форматировать для удобочитаемости. – Joey

4

Четыре строки кода и наиболее читаемые, ИМО. Нет необходимости в тройном оператора здесь:

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

Если бы я должен был написать его с помощью тройного, я хотел бы сделать:

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

Это не то же самое, что и их код orignal. –

+0

@AshBurlaczenko: В чем разница? – recursive

+0

@Ash Burlaczenko: Он выполняется точно так же, как и все. Нет смысла решать, добавлять ли 'x' или' y', если оба будут одинаковыми, а если нет, то вы добавляете 'y' * в любом случае *. – BoltClock

0

Чтобы включить вычисление z в одну строку, я хотел бы сделать что-то вроде этого :

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; 
} 

Тогда:

z = GetZBasedOnXY(z, x, y); 

Более читабельна, и если присвоение имен является хорошим, а метод имеет модульное тестирование, еще лучше.

2

вы должны сделать это с помощью круглых скобок, как это:

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

Это просто продолжать тройным оператор, а не если еще при условии, просто нужно продолжать то же самое, даже после «:». ниже - образец.

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

Reference example

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