Как обратиться, если, иначе если логика в тройной оператор?

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

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

Я могу сделать это сейчас, если существует только один оператор if:

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

Ответы

Ответ 1

Это будет так:

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.

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

Чтобы преобразовать 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);

Более читаемый, и если именование хорошее, а метод имеет unit test охват, еще лучше.

Ответ 6

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

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

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