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

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

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

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

Q&A

解決済

5回答

20489閲覧

switch文での複数条件

dekky0910

総合スコア93

C#

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

0グッド

1クリップ

投稿2017/02/22 05:45

C#なのですが、switchを使う際に条件を複数定義することは可能でしょうか?


switch(a,b)
{
case 1,0:
break;
}

みたいな形にできるのであれば教えていただきたいです。

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

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

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

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

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

archiver

2017/02/22 05:50

この例で言うと、1と0とで同じ処理をするということでいいですか?
ozwk

2017/02/22 05:52

タプル渡すみたいなことだと思います。
dekky0910

2017/02/22 05:56

説明不足で申し訳ないです  int型のaとbがあってその2つの値がそれぞれ一致してた場合に処理を行うようにしたいです
guest

回答5

0

switch 文で使えるのは整数値と文字列だけです。次のような形でどうでしょうか?

C#

1int a = 0; 2int b = 1; 3string s = string.Format("{0} {1}", a, b); 4switch (s) 5{ 6 case "0 1": 7 break; 8

投稿2017/02/22 06:09

Zuishin

総合スコア28660

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

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

Zuishin

2017/02/22 06:19

また仮に例えば b が二桁までと決まっているなら、a * 100 + b のように一つの数字が作れます。
dekky0910

2017/02/22 06:26

回答ありがとうございます。ためしにコードを作ってみたのですがビルドは通るのですが結果がdefaultになってしまいました。 他の方の回答を見る限りできないみたいですね・・・
Zuishin

2017/02/22 06:46 編集

https://ideone.com/QfIx3b 意図通り動きましたよ。 stdout のところに 0 1 と表示されていますが、これが出力です。
dekky0910

2017/02/22 06:45

{0}{1}の間にスペースが抜けていてしまいました・・・ 確かに確認したら意図通りの動きになりました!
guest

0

a,bを一つの値に合体させて判定するという若干トリッキーな方法ならあります。

c#

1long ab = ((long)a << 32) | (uint32)b; 2switch (ab) { 3case (1L << 32) | 0: 4 // a==1, b==0 5 処理 6 break; 7case (1L << 32) | 1: 8 // a==1, b==1 9 処理 10 break; 11 ... 12}

上の例ではa,bの値の範囲を限定しない場合です。32bitシフトするのはなんとなくいやなので値のビット数が小さければ必要な分だけのシフトにしたくなるかも知れません。例えばaが-100~100,bが0~7までの値しか持たないなら
int ab = (a << 3) | b;
でもよいわけです。

ボトルネック箇所で最適化したいとか、組み合わせの数が多数あるといった場合は使う気になる場合があるかも知れませんが、論理が不明瞭に(そしてバグが入り込みやすく)なるる気がするため個人的にはあまり積極的には使いたくないです。

投稿2017/02/22 06:23

KSwordOfHaste

総合スコア18394

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

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

0

ベストアンサー

パターンマッチングのことかと思いますが、
今のC#(6)ではできません。

C#にもそのうちパターンマッチングが導入される予定(ただしC#7より後)らしいので
それまで待つか
同じ.NET系言語のF#使うかです。

現実から逃げずに戦うとすると、
switchをやめるとか
switchで使える型にうまい事変換することです。(他の方が回答してくださってますね)

投稿2017/02/22 06:17

編集2017/02/22 06:55
ozwk

総合スコア13521

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

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

dekky0910

2017/02/22 06:29

回答ありがとうございます。 今後導入される予定なんてあるんですね! それまで別の方法を模索しておきます。
guest

0

できないと思います。

構文:
switch (式){
case 定数1:
// 略
}

これがコンパイルされると、
if (式 == 定数1) {}になるので、if (a, b == 定数1)はありえないかと。

参考したページ

投稿2017/02/22 06:11

liguofeng29

総合スコア801

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

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

dekky0910

2017/02/22 06:27

回答ありがとうございます。 やはりできなかったですか・・・ できるのであれば便利だなと思ったので、 別のやり方を考えて見ます。
guest

0

❝caseラベルが連続している場合のみフォールスルーが許可されている❞のを利用して、下記のようにしたらご期待の動作になりませんでしょうか?

switch(a,b) { case 1: case 0: 目的の処理 break; }

投稿2017/02/22 06:08

thunderheadJP

総合スコア22

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

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

dekky0910

2017/02/22 06:21

回答ありがとうございます。 その案もかんがえたのですが少し違っていて実現することはできませんでした。
Zuishin

2017/02/22 06:24

これ、そもそもコンパイル通らないと思います。
thunderheadJP

2017/02/22 06:30

すみません。”switch(a,b) ”のa,bを見逃していました。私のソースもコピペしたものなのでa,bのままですね。お恥ずかしい限りです。 やるとすれば、a,bに代入される最大値の桁数で0埋めした固定幅の文字列に変換したものを連結するなどになるかと思います。
maisumakun

2017/02/22 06:31

結局、「2つの値」を条件に使う、ということは達成できませんね(他のコードを挟まない状態でcaseラベルを連続させることはC#でも可能です)。
thunderheadJP

2017/02/22 06:34

Zuishinさんの方で文字列に変換する方法を具体的に回答されていますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問