1

私は、定期的に行ういくつかのことを迅速化するのに役立つコンソール アプリケーションを構築しています。クラスのさまざまなメソッドに変換される、手順の 4 つのオプションを含むメニューがあります。

基本的には次のようなものです。

何をしたいですか?

1 ディス・シング

2 ザット・シング

3 いくつかのもの

4 クールなもの

0 すべてのもの。

入力コマンド文字列:_

現在、次の方法で有効な入力をチェックしています。

while (command.IndexOfAny("12340".ToCharArray()) == -1)
{
  //Display the menu and accept input
}

そして、次の方法でフローを制御します。

if (command.IndexOf("1") > 0 )
{
  thisThing();
}

if (command.IndexOf("2") > 0 )
{
  thatThing();
}

if (command.IndexOf("3") > 0 )
{
  someStuff();
}

if (command.IndexOf("4") > 0 )
{
  coolStuff();
}

if (command.IndexOf("0") > 0 )
{
  thisThing();
  thatThing();
  someStuff();
  coolStuff();
}

目標は、入力を提供し、示されているように 1 つ以上のプロセスを実行することです。

1 : thisThing()

13 : thisThing() と someStuff();

42 : thatThing()とcoolStuff();

0 : 定義したすべてのプロセスを実行します。

より良いプラクティスでこのようなことを行う方法はありますか?

4

4 に答える 4

2

私は作成しますDictionary<char, DoSomething>

public delegate void DoSomething();

Dictionary<char, DoSomething> commands = new Dictionary<char, DoThing>();
commands.Add('0', new DoSomething(DoAll));
commands.Add('1', new DoSomething(ThisThing));
commands.Add('2', new DoSomething(ThatThing));
commands.Add('3', new DoSomething(SomeStuff));
commands.Add('4', new DoSomething(CoolStuff));

次に、入力の検証後

foreach(char c in command.ToCharArray()) 
{  
   // Better check if the input is valid
   if(commands.ContainsKey(c))
       commands[c].Invoke();
}

ディクショナリには、キーとして使用できる文字が含まれ、値として、戻り値が void で引数がない関数へのデリゲートが含まれます。これで、入力 char を char ごとにループして、関連するメソッドを呼び出すだけです。

このアプローチは選択肢が非常に少ないため、単純なif/else if/elseまたはswitch/caseよりも優れているわけではないことを忘れないでください。また、この方法では、ユーザーがメソッドの実行順序を入力24または42反転する可能性があり、これは実際のコンテキストでは許可されません。

于 2014-09-11T15:10:05.720 に答える
1

デリゲートの辞書を作成します。ディクショナリ キーが入力値になり、デリゲートがコードを実行します。

構文については、C# Store functions in a Dictionary で説明しています。

このようにして、入力文字列をループに入れ、辞書検索を行うことができます。値が存在する場合はデリゲートを実行し、そうでない場合はスキップします。

If else if endif セットよりも特に優れているわけではありませんが、より魅力的で拡張性があると思います。

于 2014-09-11T15:07:59.913 に答える