15

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

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

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

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

6 に答える 6

39

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

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ください。ステートメントのドロップイン置換ではありません。

于 2012-07-11T15:30:17.357 に答える
5

使用できます

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

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

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

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

于 2012-07-11T15:28:45.213 に答える
4

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

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

三元を使用してそれを書く必要がある場合、私は次のようにします。

z += (x == y || x == z) ? y : 1;
于 2012-07-11T15:31:26.613 に答える
2

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

(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
于 2012-07-11T15:34:01.910 に答える
1

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

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

参考例

于 2017-04-12T11:12:40.007 に答える
0

計算を1行に変換する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);

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

于 2012-07-11T15:32:12.370 に答える