почему не работает цикл while? Может кто-нибудь сказать мне, как работает сообщение об ошибке? - PullRequest
2 голосов
/ 30 мая 2019

Как я могу перезапустить этот кодовый блок? Моя идея, если вы введете символ, который будет возвращать сообщение об ошибке. Какое условие для цикла?

string r_operation;
Console.Write("\tBitte geben Sie ihre Rechenoperation ein: ");
r_operation = Console.ReadLine();
-------------

while (?r_operation = Console.ReadLine())
{
Console.WriteLine("\tUngültige Eingabe. Bitte geben Sie nur Zahlen ein!");
}

1 Ответ

1 голос
/ 30 мая 2019

Вы можете преобразовать свой существующий код, чтобы использовать метод int.TryParse, который возвращает bool, указывающий, является ли входная строка действительным числом (и устанавливает параметр out в преобразованное значение):

Console.Write("\tBitte geben Sie ihre Rechenoperation ein: ");
string r_operation = Console.ReadLine();
int result = 0;

while (!int.TryParse(r_operation, out result))
{
    Console.WriteLine("\tUngültige Eingabe. Bitte geben Sie nur Zahlen ein!");
    Console.Write("\tBitte geben Sie ihre Rechenoperation ein: ");
    r_operation = Console.ReadLine();
}

// When we exit the while loop, we know that 'r_operation' is a number, 
// and it's value is stored as an integer in 'result'

Другой способ сделать это - инкапсулировать процесс получения строго типизированного числа от пользователя в метод.Вот один из них, который я использую:

private static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
{
    int result;
    var cursorTop = Console.CursorTop;

    do
    {
        ClearSpecificLineAndWrite(cursorTop, prompt);
    } while (!int.TryParse(Console.ReadLine(), out result) ||
             !(validator?.Invoke(result) ?? true));

    return result;
}

private static void ClearSpecificLineAndWrite(int cursorTop, string message)
{
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(message);
}

С помощью этих вспомогательных методов ваш код может быть уменьшен до:

int operation = GetIntFromUser("\tBitte geben Sie ihre Rechenoperation ein: ");

И если вы хотите добавить некоторые дополнительные ограничения, вспомогательный метод также принимаетв функции validator (которая принимает int и возвращает bool, указывающий, действителен ли int).Поэтому, если вы хотите ограничить число от 1 до 5, вы можете сделать что-то вроде:

var result = GetIntFromUser("Enter a number from 1 to 5: ", i => i > 0 && i < 6);
...