アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
C#で次のようなプログラムを書いているのですが、もっと簡単なもの(というか少ない行数に)直せないでしょうか?
//----------------------------
switch (e.KeyCode)
{
case Keys.F1:
ret = 1;
break;
case Keys.F2:
ret = 2;
break;
case Keys.F3:
ret = 3;
break;
case Keys.F4:
ret = 4;
break;
case Keys.F5:
ret = 5;
break;
case Keys.F6:
ret = 6;
break;
case Keys.F7:
ret = 7;
break;
case Keys.F8:
ret = 8;
break;
case Keys.F9:
ret = 9;
break;
default:
}

A 回答 (3件)

Keys.F1からKeys.F9が連続した数値であるという性質を利用しています。


if (e.KeyCode >= Keys.F1 && e.KeyCode <= Keys.F9)
{
ret = e.KeyCode - Keys.F1 + 1;
}
else
{
ret = -1;
}

厳密に言えば、今後、永久にKeys.F1からKeys.F9が連続であることが保障されているとは限らないので、
あなたが提示したコードのほうが、信頼性は高いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
tatsu99さんの教えてくれた方法で行くことにしました。

>今後、永久にKeys.F1からKeys.F9が連続であることが保障されているとは限らないので、
だめになったら(変更されたら)、その時に別の方法も考えたいと思います。

お礼日時:2017/02/01 08:25

「テーブルを引く」 が定石ですね。



ここでいう「テーブル」とは配列や辞書のことです。
switchが大きくなってきたら置き換えを検討しましょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
今回はN0.1の方の方法でいくことにしました。
でも、今後のプログラムの作成時に参考にします。

お礼日時:2017/02/01 08:34

if 文で使用している変数名およびそのプロパティ名から KeyDown イベント内での処理と思われます。


# 今回は上記が特徴的だったからわかりましたが、本来ならば質問者様がプログラム中に出てくる変数(今回の場合は e)の型を明記すべきです。次回からはご注意ください。
したがいまして、上記イベント内での処理をイメージして以下の通り簡略化しました。
なお、教えて!goo の投稿の仕様上インデントを全角空白で行っています。

// (多分)押されたキーとそれに対する ret の値の対応
// イベント発生するたびにこの対応を用意するのは時間の無駄なので
// インスタンス変数化して適切な場所で初期化したほうがいいかも
Dictionary<Keys, int> retvals = new Dictionary<Keys, int> {
 {Keys.F1, 1},
 {Keys.F2, 2},
 {Keys.F3, 3},
 {Keys.F4, 4},
 {Keys.F5, 5},
 {Keys.F6, 6},
 {Keys.F7, 7},
 {Keys.F8, 8},
 {Keys.F9, 9},
};

int ret = 0;
if (retvals.TryGetValue(e.KeyCode, out ret))
{
 // (多分)ファンクションキーが押された時の処理
}
else
{
 // (多分)ファンクションキーが押されなかった時の処理
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>if 文で使用している変数名およびそのプロパティ名から KeyDown イベント内での処理と思われます。
># 今回は上記が特徴的だったからわかりましたが、本来ならば質問者様がプログラム中に出てくる変数(今回の場合は e)の型を明記すべきです。次回からはご注意ください。

おっしゃる通りです。KeyDownイベント内の処理です。
今後気を付けます。
ご提案していただいた方法は、今後のプログラムで使えそうです。
ありがとうございます。

お礼日時:2017/02/01 08:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!