Я нашел действительно полезным использовать вспомогательный метод, который будет получать число от пользователя.Этот метод использует TryParse
для преобразования входных данных в число, что очень удобно, поскольку возвращает bool
, указывающий на успех, а затем для преобразованного числа устанавливается параметр out
.Обратите внимание, что в вашем методе выше, если пользователь вводит недопустимое число, такое как «два», он выдаст исключение.
Метод ниже также принимает необязательную строку «prompt», которая отображается впользователь, а затем он зацикливается, пока они не введут действительное значение:
private static int GetIntFromUser(string prompt)
{
int input;
do
{
Console.Write(prompt);
} while (!int.TryParse(Console.ReadLine(), out input));
return input;
}
Теперь, чтобы получить целое число от пользователя, мы просто сделаем:
int removeGroc = GetIntFromUser("What would you like to remove from the list?");
Это можно улучшитьнемного добавив функцию, где вместо того, чтобы задавать вопрос снова в новой строке (которая может медленно поглотить пространство окна консоли, если они продолжают вводить неверные данные), мы можем использовать Console.CursorTop
и Console.SetCursorPosition
, чтобы перезаписать текущую строкус пробелами (очистка их исходного ввода), а затем снова напишите вопрос в той же строке:
private static int GetIntFromUser(string prompt)
{
int result;
var cursorTop = Console.CursorTop;
do
{
// Set the cursor to the beginning of the line,
// write a blank line, and set it to the beginning again
Console.SetCursorPosition(0, cursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, cursorTop);
Console.Write(prompt);
} while (!int.TryParse(Console.ReadLine(), out result));
return result;
}
Хорошо, теперь нам просто нужно добавить способ указать действительные записи, чтобы, если они вводятномер, но он не действителен для нашего сценария, он будет продолжать запрашивать у них действительный ввод.
Первым делом я написал несколько перегрузок этого метода, которые принимали такие вещи, как minValue
, maxValue
, даже List<int> validNumbers
и List<int> invalidNumbers
, и затем имели логику, чтобы проверить,число, которое они ввели, соответствовало всем этим критериям.
Но так как у нас есть возможность передать функцию методу, я решил вместо этого просто позволить клиенту передавать свои собственныефункция проверки , которая принимает int
и возвращает bool
.Таким образом, один и тот же метод может быть повторно использован для всех видов сценариев:
private static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
{
int result;
var cursorTop = Console.CursorTop;
do
{
Console.SetCursorPosition(0, cursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, cursorTop);
Console.Write(prompt);
} while (!int.TryParse(Console.ReadLine(), out result) ||
(validator != null && !validator.Invoke(result)));
return result;
}
Теперь у нас есть метод, который будет принимать любой тип проверки, который мы захотим, и применим его к пользовательскому вводу.Для вашего примера требования состоят в том, чтобы число было больше или равно 0
и меньше или равно list.Count - 1
(чтобы получить действительный индекс в list
).Это можно записать как лямбда-метод, например:
i => i >= 0 && i <= list.Count - 1
Итак, применяя это к вашему примеру, мы теперь можем просто сделать что-то вроде:
case 2:
{
int minVal = 0;
int maxVal = list.Count - 1;
int removeGroc = GetIntFromUser($"Enter the item to remove ({minVal} - {maxVal}): ",
i => i >= minVal && i <= maxVal);
list.RemoveAt(removeGroc);
break;
}