Для получения проверенного ввода от пользователя (особенно когда ожидается, что тип будет отличным от строки), я считаю действительно полезным использовать вспомогательный метод.
В приведенном ниже методе используется строкакоторый отображается пользователю (запрос на ввод), а затем продолжает запрашивать ввод у пользователя, пока он не введет действительное число (TryParse
является частью условия while
).
Это такжепринимает необязательный параметр функции, который можно использовать для проверки ввода, если вы хотите наложить на него дополнительные ограничения.Функция определена для получения double
(пользовательский ввод) и возврата bool
(true
, если ввод действителен):
private static double GetDoubleFromUser(string prompt, Func<double, bool> validator = null)
{
double result;
do
{
Console.Write(prompt);
} while (!double.TryParse(Console.ReadLine(), out result) ||
(validator != null && !validator.Invoke(result)));
return result;
}
Чтобы использовать это в своем коде, выбудет просто сделать что-то вроде:
Console.WriteLine($"Please sir, enter {SIZE} numbers");
for (int i = 0; i < SIZE; i++)
{
array[i] = GetDoubleFromUser($" Enter number #{i + 1}: ");
}
Выход
![Image of console output of code sample above](https://i.stack.imgur.com/gdalI.png)
Но в других случаях вывозможно, вы захотите еще больше ограничить число, и в этом случае вы можете передать в функцию метод проверки.Один простой способ сделать это - передать функцию как лямбда-выражение.Например, это выражение: i => i > 10
означает «вернуть результат сравнения, если i
больше 10
», или, другими словами, «вернуть true
, если i > 10
, в противном случае вернуть false
».
Вы можете передать это нашему GetDoubleFromUser
методу, например так:
double greaterThan10 = GetDoubleFromUser("Enter a number greater than 10: ", i => i > 10);
, и теперь метод будет продолжать цикл, пока ввод не является числом или вход не больше 10!
Выход
![Image of console output of code sample above](https://i.stack.imgur.com/TjXUR.png)