Найти идентификатор в списке строк - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в программировании.Я работаю над чем-то вроде списка покупок.У меня есть список строк, где пользователь может добавлять продукты в:

List<string> list = new List<string>();

Теперь, если пользователь хочет удалить из списка определенный объект (продуктовый), я бы хотел, чтобы он делал это с номерами, а не снабрав название бакалеи в окне консоли, что я выполнил здесь:

case 2:
Console.WriteLine("What would you like to remove from the list?");
int removeGroc = Convert.ToInt32(Console.ReadLine());
list.RemoveAt(removeGroc);
break;

Что я хочу сделать, это убедиться, что убедитесь, что если пользователь входит, например, номер 5, но есть только 3 объектав списке, поэтому пользователю будет предложено ввести число еще раз, так как в списке только 3 объекта (0, 1 и 2).Я искал везде и пробовал разные вещи, но они, кажется, не работают, или мои знания слишком плохи, чтобы понять это.Так как же мне поступить?У меня есть список того, что мне нужно сделать, но я не знаю, как это сделать.Я думаю, что мне нужно найти «id» списка, а затем проверить, если он существует, но я не могу найти, как это сделать в Интернете.

Вот редактирование, которое сработало, спасибок комментариям, если любой другой новичок видит это:

Console.WriteLine("What would you like to remove from the list?");
var removeGroc = Console.ReadLine();
int removeGrocId;
bool parseSuccess = int.TryParse(removeGroc, out removeGrocId);
if (removeGrocId < list.Count)
   list.RemoveAt(removeGrocId);
else
   Console.WriteLine("Write a valid number!");

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я нашел действительно полезным использовать вспомогательный метод, который будет получать число от пользователя.Этот метод использует 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;
}
0 голосов
/ 21 февраля 2019

Вы можете сделать это с помощью

list.Count; //return the number of the items in the list

Таким образом, вы проверяете его по количеству элементов в списке:

if(removeGroc > listCount){ //do someting }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...