Я использую пользовательский метод для получения строго типизированных данных от пользователя. Он принимает строку, которая используется для запроса данных у пользователя, и необязательный метод проверки, который можно использовать для проверки того, что входные данные соответствуют вашим критериям. Метод запускает цикл, который непрерывно запрашивает у пользователя, пока он не введет действительные данные:
private static double GetDoubleFromUser(string prompt, Func<double, bool> validator = null)
{
double result;
var cursorTop = Console.CursorTop;
do
{
ClearSpecificLineAndWrite(cursorTop, prompt);
} while (!double.TryParse(Console.ReadLine(), out result) ||
!(validator?.Invoke(result) ?? true));
return result;
}
private static char GetCharFromUser(string prompt, Func<char, bool> validator = null)
{
char result;
var cursorTop = Console.CursorTop;
do
{
ClearSpecificLineAndWrite(cursorTop, prompt);
result = Console.ReadKey().KeyChar;
} while (!(validator?.Invoke(result) ?? true));
Console.WriteLine();
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);
}
С этими вспомогательными методами ваш код будет выглядеть следующим образом:
public static void prompt()
{
double num1 = GetDoubleFromUser("Please input a number: ");
double num2 = GetDoubleFromUser("Please input a second number: ");
char operation = GetCharFromUser(
"Do you want to (m)ultiply or (d)ivide the first number by the second: ",
c => c == 'm' || c == 'd');
if (operation == 'm')
{
double product = multiply(num1, num2);
Console.WriteLine("The product of {0} and {1} is {2}", num1, num2, product);
}
else
{
if (num2 == 0)
{
Console.WriteLine("Sorry, you cannot divide by zero.");
}
else
{
double result = divide(num1, num2);
Console.WriteLine("The quotient of {0} and {1} is {2}", num1, num2, result);
}
}
Console.ReadLine();
}