質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

2794閲覧

switch文で三項演算子を使うのと似たことがしたい

Koopa

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/09/24 07:38

編集2018/09/24 07:48

下のような処理がしたいのですが言語上機械には読めません。~~(うん、人間には言わんとすることはわかるはずだ…!)
~~
やはり…switch文だけでは無理ですかね…。
また、簡潔に書くことを前提としての解決策はあるでしょうか。
なにかいい案があればおねがいします。


とりあえずやりたかったのはこれです↓

C#

1 switch (num) 2 { 3 case 条件 ? 1 : 2: 4 //処理1 5 break; 6 case 3: 7 //処理2 8 break; 9 case 4: 10 //処理3 11 break; 12 }

まあ、当然入るわけもなく。
エラーメッセージは言うまでもなく "定数値が必要です。"

また、

C#

1switch (num) 2 { 3 case 1: 4 case 2: 5 if(num==(条件?1:2)) 6 {//処理1} 7 break; 8 case 3: 9 //処理2 10 break; 11 case 4: 12 //処理3 13 break; 14 } 15

と書くには1,2,case,numがどれもそれぞれ前者より1つずつ多く必要なようだ。
コンパイルしないと元も子もないので今はこれを使ってますが。

本来 前者ができれば満足ですが出来ないので不満足。
代わりに何か考えてほしいという質問です。
…若干贅沢でしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/09/24 07:44

人間ですが、そこの if 文の意味がわかりません。
Koopa

2018/09/24 07:50 編集

みすった。直しまーす^^
Koopa

2018/09/24 07:48

修正しました。ありがとうございます
Zuishin

2018/09/24 07:51

修正を見ましたがやっぱりわかりません。tacsheaven さんのおっしゃる通り無意味なものにみえます。あと多分カッコの位置が違います。
Zuishin

2018/09/24 07:53

失礼、意味がわかりました。
guest

回答5

0

ベストアンサー

型スイッチを使えばできるかもしれません。

cs

1switch (num) 2{ 3case int i when (i == (条件 ? 1 : 2)): 4 //処理1 5 break; 6case 3: 7 //処理2 8 break; 9case 4: 10 //処理3 11 break; 12}

型スイッチ

投稿2018/09/25 10:11

編集2018/09/25 10:12
gaya-K

総合スコア449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koopa

2018/09/25 11:28

できました…!!!本当にありがとうございます!!そうですよこれですこれですこんなのを求めてました。 親切にも、貼っていただいた型スイッチのページを拝見させてもらったところ、C#7だったんですね、switch文の使い勝手が各段に上がっていてびっくりです!swtch文好きなので嬉しかった。最新バージョンにも関わらず、すでに使いこなしているなんてすごいと思います!!!(私は確認すらしてませんでした) とても勉強になります。本当にありがとうございます!!
guest

0

C#

1 case 1: 2 case 2: 3 if(num==(条件?1:2)) 4 //処理1 5 break;

は、以下にようにしてはダメ?

C#

1 case 1: 2 if(条件)) 3 //処理1 4 break; 5 case 2: 6 if(!条件) 7 //処理1 8 break;

コンパクトにしようとするのも良いですが、凝りすぎると後で困ると思います。
また、[処理1] は別関数(メソッド)にすれば、見易いと思います。

また、確認してませんが、同じ様な質問を続けてませんか? 一つにするか、前のをクローズにした方が良いと思います。

投稿2018/09/24 07:53

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koopa

2018/09/24 07:59

…ばれてましたか
guest

0

ふわっとした回答です、すみません。

質問を拝見していて思ったんですが、numって12になるんですかね?(以下ならない想定で書いています)

  • 現在採用しているというコードについて

tacsheavenさんのご指摘もありますが、↓ここでの「条件」がどのようなものであっても(グローバルな値であったり、全くもってnumと関係ないものであっても)、三項演算子の結果は1または2になり、caseの書き方からして、1でも2でもifの条件がtrueになることは確定的で、賢いコンパイラだったらifを外す可能性すらあります。

csharp

1switch (num) 2 { 3 case 1: 4 case 2: 5 if(num==(条件?1:2))
  • やりたかったコード

csharp

1 switch (num) 2 { 3 case 条件 ? 1 : 2:

このところを見て、なんとなく(PHPer的感覚で)「条件」のところでnumを計算しているような気がしました。例えばnum % 2 == 1とか。
ただ、こう考えたときには、三項演算子ではnumをどのように計算しても、1または2になってしまい、case 3:が絶対に実行できないという矛盾があります。

やりたかったコードについての助言としては、switch(num)で条件判定して値を導出すればいいのではないかと思いました。例えばswitch(num%10)とか、どうしても三項演算子を使いたいならswitch (num % 10 < 3 ? 1 : num)とか。

別の観点で、やりたいコードに近いことは少なくともjsやphpならswitch(true)というイディオムで書けます。オンラインで実行できるサンドボックスサイトもありますので、やりたいことが本当にやりたいとおりになっているのか(case 3を通らないコードになっていないのか)検証することができるように思います。(質問的にも、jsだったらこう書けるんだけどC#で似た感じに書けませんか?のほうが通じやすいように思います)。

num12になるとすれば、Zuishinさんの回答で良いと思います。むしろ、そのように書かないと分かりにくいです。

蛇足ですが、少し離れた観点で。
コードが思ったとおりスマートにならないのは多分numが複数の意味をもっていたり、intでは表現しきれない意味を負わされているのだと推測します。
ご自身のコードであれば、データ構造やここに来るまでのロジックを見直されたほうがよいと思います。また、共同作業しているコードだとしたら(仮にできたとしても)ここだけ急に他と毛色の違うコードを書くことは必ずしも良いことではないです(凝ったコードを後から見て困るのが自分でない可能性があるからです)。

投稿2018/09/25 01:44

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#

1switch (num) 2 { 3 case 条件 ? 1 : 2: 4 //処理1 5 break; 6 case 3: 7 //処理2 8 break; 9 case 4: 10 //処理3 11 break; 12 }

これは次のように書き換えられます。

C#

1switch (num) 2 { 3 case 1: 4 if (条件) 処理1(); 5 break; 6 case 2: 7 if (!条件) 処理1(); 8 break; 9 case 3: 10 //処理2 11 break; 12 case 4: 13 //処理3 14 break; 15 }

投稿2018/09/24 08:00

Zuishin

総合スコア28662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそも num が 1 ないし 2 のとき、を処理するのに三項演算子が必要ですか?
三項演算子(式1 ? 式2:式3)は式1 が真なら式2 の値を、偽なら式3の値を返します。

挙げられた例だと、num が 1 ないし 2 のときを満たせる式1、式2、式3 の組み合わせはないのでは?
(式1 が (num == 1 || num == 2) なら可能ですが、この場合結果は式2 になり、式3 が無意味になります)

そもそも

C#

1switch(num) { 2 case 1: 3 case 2: 4 // 処理1 5 break; 6 ...

この場合、num が 1 でも 2 でも処理1 に飛んできますので、もう一度 if で判定する理由がありません。

投稿2018/09/24 07:45

編集2018/09/24 07:46
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問