Как да превърна логиката 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: Guffa има същата идея като мен. На мен решението му ми изглежда доста читаво. - person recursive; 11.07.2012

Четири реда код и най-четливият, IMO. Тук няма нужда от троичен оператор:

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