2016-08-03 7 views
1

私は別の非存在になるように、ユーザーが「Q」二状態ながら終わるそのうちの一つのループ、プログラム

//press 'q' to quit application 
ConsoleKeyInfo info = Console.ReadKey(true); ; 
while (info.KeyChar != 'q') { 
    info = Console.ReadKey(true); 
} 

がどのように私は、この構造を変更するか、プログラムを終了し、いくつかのコードを持っていますキャプチャされたキーが 'p'の場合、動作を終了させますか?

私は条件を変更する場合:

(info.KeyChar != 'q') && (info.KeyChar != 'p') 

次に 'p' は、プログラムを終了します。たとえ私が 'p'の場合を処理するためにwhileループの中にロジックを入れても。また

ConsoleKeyInfo info = Console.ReadKey(true); 
while (true) { 
    info = Console.ReadKey(true); 
    if (info.KeyChar == 'q') break; 
    else if (info.KeyChar == 'p') { 
     //other behavior 
    } 
} 

は、何らかの理由でプログラムを終了するために二回「Q」を押して、ユーザが必要ですが、意図した動作では、アクションが一つのキーを押すことでトリガされていることです。あなたが二回ReadKeyと呼ばれているので

+0

'switch'キーワードをチェックしてください。 –

+0

私はスイッチについて知っていますが、ここで私の問題をどのように解決できますか?私の質問の最後にあるコードを参照してください –

+0

私は二番目のソリューションは大丈夫だと思いますjust info = Console.ReadKey(true);それ以外の場合は、キーを2回押すことを尋ねるべきではありません。 – Junaid

答えて

3
var exitWhile = false; 
while (!exitWhile) { 
    ConsoleKeyInfo info = Console.ReadKey(true); 
    switch (info.KeyChar) { 
     case 'q': 
      exitWhile = true; 
      break; 

     case 'p': 
      //something else to do 
    } 
} 
+0

はい、それははるかにクリーンで、私は自分の問題がループの前にキーを読み取っていたのを見ます。ありがとう –

1

、これを試してみてください。個人的に

while (true) { 
    var info = Console.ReadKey(true); 
    if (info.KeyChar == 'q') break; 
    else if (info.KeyChar == 'p') { 
     //other behavior 
    } 
} 
+0

それはそれでした。ループの前に私の読んで最初の入力を取っていた。まことにありがとうございます! –

+0

np、ようこそ! –

0

、私はこのようなものでいいと思う:

ConsoleKeyInfo info; 
bool done = false; 
while (!done) { 
    info = Console.ReadKey(true); 
    switch(info.KeyChar) { 
     case 'p': 
      // do something 
      break; 
     case 'q': 
      done = true; 
      // do something else 
      break; 
    } 
} 
+0

はい、それははるかにクリーンで、私は自分の問題がループの前にキーを読み取っていたのを見ます。ありがとう –

0
do { 
    info = Console.ReadKey(true); 
    if (info.KeyChar == 'q') break; 
    else if (info.KeyChar == 'p') { 
    //other behavior 
    } 
}while (true); 
0
while (true) 
{ 
    ConsoleKeyInfo info = Console.ReadKey(true); 
    { 
     if (info.KeyChar == 'q') 
      Environment.Exit(0); 
     else if (info.KeyChar == 'p') 
     { 
      //other behavior 
     } 
    } 
} 
0
ConsoleKeyInfo info = Console.ReadKey(true); 
while (info.KeyChar != 'q') { 
    if (info.KeyChar != 'p') { 
     // handle p case 
    } 
    info = Console.ReadKey(true); 
} 
0

あなたは本当にスープアップすることができますあなたのプログラムはより機能的なプログラミングスタイルのいくつかのコードを持っています。私はあなたがやめようとしているより複雑なものをやりたいと思っています。そして、より基本的なシナリオのために過度のパターンを提示しています。要点は、コードを少なくして、ほとんどすべてを1か所で指定できるということです。そして実行されるメソッドは記述的でなければなりません。ほとんど自己記述的です。

これを使用すると、コードを実際にクリーンアップすることができます。

あなたが次のレベルにこれを取るために、いくつかのマルチキャストをやって起動でき
// Bind keys to vocabulary and actions, all in high-signal code 
    private static keyActions = new Dictionary<char, Action<KeyActionResult>> { 
     ['p'] = KeepLoopingAfter(() => Console.WriteLine("You pressed 'p'!")), 
     ['d'] = KeepLoopingAfter(DoSomethingComplicated), 
     ['q'] = Quit(), 
     ['x'] = QuitAfter(() => Console.WriteLine("Delete, then quit!")) 
    } 
     .AsReadOnly(); 

    // Run the main decision loop 
    public static void Main() { 
     bool shouldQuit; 
     do { 
     ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
     Action action; 
     if (keyActions.TryGetValue(keyInfo.KeyChar, out action)) { 
      shouldQuit = action().ShouldQuit; 
     } else { 
      shouldQuit = false; 
     } 
     } while (!shouldQuit) 
    } 
} 

...

関連する問題