web-dev-qa-db-ja.com

if、else ifロジックを三項演算子に変換する方法は?

コードの行を減らすために三項演算子を使い始めたので、これが可能かどうか疑問に思っていました。私はそれが大好きです。

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

次のようなifステートメントが1つしかない場合は、これを実行できます。

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

これは次のようになります。

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

ただし、注意して使用してください。多くの場合、コードは単純であるほど読みやすく、保守しやすく、ネストされた条件付き操作はあまり読みやすくありません。また、これは、条件付き操作の結果としてexpressionがある場合にのみ使用してください。これは、ifステートメントのドロップイン置換ではありません。

32
Guffa

使用できます

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

しかし正直なところ、それはあなたが以前持っていたものよりも実際には読みやすくはありません。括弧を追加することで、少し明確にすることができます。

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

しかし、ゴルフをするとき以外は、一般的にネストされた条件演算子には近づかないでしょう。

5
Joey

4行のコード、および最も読みやすいIMO。ここでは三項演算子は必要ありません:

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

三項を使用して記述する必要がある場合は、次のようにします。

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

次のような括弧を使用してこれを行う必要があります。

(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
2
Soroosh Bateni

これは、else if条件ではなく、三項演算子を使用して続行するのが簡単です。「:」の後でも同じように続行する必要があります。以下はサンプルです。

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

参考例

1
Lawrine

zの計算を1行に変換するには、次のようにします。

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

より読みやすく、命名が適切で、メソッドに単体テストカバレッジがある場合は、さらに優れています。

0