C # Возникли проблемы с TryParse - PullRequest
0 голосов
/ 27 февраля 2019

Как бы я добавил TryParse к этому коду, поэтому, если пользователь введет письмо, он скажет ему: «Недействительно, пожалуйста, введите только цифры».Я пробовал несколько способов, но это нарушает мой код.Я пробовал это с for и while петлями.Но когда я заставил его работать, потребовалось только 1 число, а затем присвоил этот номер всем моим массивам.

{
    const int SIZE = 2;

    double[] array = new double[SIZE];
    Console.WriteLine("Please Sir Enter 2 numbers");
    for (int i = 0; i < SIZE; i++)
    {
         array[i] = Convert.ToDouble(Console.ReadLine());
    }
    Console.WriteLine("===============================================");
    Console.WriteLine("The Values you've entered are");
    Console.WriteLine("{0}{1,8}", "index", "value");
    for (int counter = 0; counter< SIZE; counter++)
    {
         Console.WriteLine("{0,5}{1,8}", counter, array[counter]);
    }
    Console.WriteLine("===============================================");            
    Console.ReadLine();
}

Ответы [ 2 ]

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

Для получения проверенного ввода от пользователя (особенно когда ожидается, что тип будет отличным от строки), я считаю действительно полезным использовать вспомогательный метод.

В приведенном ниже методе используется строкакоторый отображается пользователю (запрос на ввод), а затем продолжает запрашивать ввод у пользователя, пока он не введет действительное число (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


Но в других случаях вывозможно, вы захотите еще больше ограничить число, и в этом случае вы можете передать в функцию метод проверки.Один простой способ сделать это - передать функцию как лямбда-выражение.Например, это выражение: 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

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

Используйте цикл while внутри цикла for следующим образом:

for (int i = 0; i < SIZE; i++)
{
   string input = Console.ReadLine();
   double num = 0;
   while(!Double.TryParse(input, out num))
   {
       Console.WriteLine("Not valid, please enter numbers only");
       input = Console.ReadLine();
   }
    array[i] = num;
}
...