Как превратить логику if, else if в тернарный оператор?

Мне просто интересно, возможно ли это, потому что я начал использовать тернарные операторы для сокращения строк кода, и мне это нравится.

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

я могу сделать это сейчас, если есть только один оператор if, подобный этому:

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

person some_bloody_fool    schedule 11.07.2012    source источник
comment
Я начал использовать тернарные операторы, чтобы сократить количество строк кода, и мне это нравится.   -  person BoltClock    schedule 11.07.2012
comment
Хорошо, если есть только одна инструкция, вы можете удалить фигурные скобки. И это более читабельно, чем троичное. Имо   -  person Maresh    schedule 11.07.2012
comment
@BoltClock Вместо того, чтобы просто сказать это, можете ли вы объяснить, почему это плохо? Я всегда готов слушать.   -  person some_bloody_fool    schedule 11.07.2012
comment
Вы должны быть осторожны с использованием тернарного оператора. Не используйте его только потому, что он круто выглядит или просто для сокращения количества строк кода. Как сказал Мареш, если вы действительно хотите сократить количество строк кода, вы можете начать с удаления фигурных скобок. Не нужно сжимать все в одну строку. Вариант использования, который вы здесь привели, - это тот, где вы действительно должны стремиться не использовать его, даже если теоретически можете.   -  person BoltClock    schedule 11.07.2012
comment
@BoltClock А, понятно, спасибо   -  person some_bloody_fool    schedule 11.07.2012


Ответы (6)


Это было бы так:

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

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

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

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

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

person Guffa    schedule 11.07.2012

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

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

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

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

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

person Joey    schedule 11.07.2012
comment
Я думаю, что с некоторыми разумными переводами строк это может быть более читабельно, чем оригинал. - person recursive; 11.07.2012
comment
Майкл: Согласен; добавил примечание для этого. рекурсивный: я просто попытался отформатировать его в несколько строк, но не смог сделать его более понятным. Может быть, я просто сосать. Но, возможно, сложные условные операторы трудно форматировать для удобочитаемости. - person Joey; 11.07.2012
comment
@Joey: у Гуффы та же идея, что и у меня. Мне его решение кажется вполне читаемым. - person recursive; 11.07.2012

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

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

Если бы мне пришлось написать это, используя троицу, я бы сделал:

z += (x == y || x == z) ? y : 1;
person D'Arcy Rittich    schedule 11.07.2012
comment
@AshBurlaczenko: Какая разница? - person recursive; 11.07.2012
comment
@Ash Burlaczenko: Однако он выполняется точно так же. Нет смысла решать, добавлять ли x или y, если оба будут одинаковыми, а если нет, то вы добавляете y все равно. - person BoltClock; 11.07.2012
comment
@AshBurlaczenko Что касается моего тестирования, то так оно и есть. - person Adam Houldsworth; 11.07.2012
comment
Да, это фактически то же самое, что и в оригинале, когда x == y, z += x совпадает с z += y. Однако я почти уверен, что это всего лишь пример, а использование условного оператора является актуальным вопросом. - person Guffa; 11.07.2012

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

(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
person Soroosh Bateni    schedule 11.07.2012

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

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

Справочный пример

person Lawrine    schedule 12.04.2017

Чтобы превратить вычисление 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);

Более читаемый, а если название хорошее и метод имеет модульное тестовое покрытие, то еще лучше.

person Adam Houldsworth    schedule 11.07.2012
comment
Это не троичная операция для if else. - person dicemaster; 12.07.2018
comment
@dicemaster Да, я в курсе. Я предлагал другой способ сжатия условного оператора в одну строку при использовании. Множество других ответов, показывающих троицу (и то, как ужасно она выглядит). - person Adam Houldsworth; 12.07.2018