Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Некорректная работа ввода с консоли

cki = Console.ReadKey(true); if (cki.Key == ConsoleKey.Escape) break;
var choice = Console.ReadLine();
switch (choice) { case "1": Console.WriteLine("1"); break; case "2": Console.WriteLine("2");; break; case "3": Console.WriteLine("3"); break; }
Проблема в том, что при попытки ввести допустим "1", приходится нажимать дважды на клавишу. Я подозреваю,что это из-за подряд идущих Console.ReadKey и Console.ReadLine. Как можно исправить эту проблему?


Ответ

Единственный вариант, который я вижу, — создать свою альтернативу Console.ReadLine(), которая будет реагировать не только на Enter, но и на Escape:
///

/// Console extensions. /// public static class ConsoleEx { /// /// Reads the next line of characters from the standard input stream. /// /// /// A line of characters read from the input stream, or null if ESC was pressed. /// public static string TryReadLine() { StringBuilder builder = new StringBuilder();
for (;;) { ConsoleKeyInfo info = Console.ReadKey(true);
switch (info.Key) { case ConsoleKey.Enter: Console.WriteLine(); return builder.ToString();
case ConsoleKey.Escape: return null;
default: Console.Write(info.KeyChar); builder.Append(info.KeyChar); break; } } } }
Использование в вашем случае будет таким:
string choice = ConsoleEx.TryReadLine();
switch (choice) { case "1": case "2": case "3": Console.WriteLine(choice); break; case null: // Handle ESC here. break; default: Console.WriteLine("Invalid input"); break; }

Комментариев нет:

Отправить комментарий