Лучший способ проверить ввод строки чтения в C #?

StackOverflow https://stackoverflow.com/questions/503383

  •  20-08-2019
  •  | 
  •  

Вопрос

О, 2 вещи:1) Это консольное приложение.2 ) Я знаю, что это на датском, но на самом деле это не имеет значения, это просто пример запроса некоторых данных.Текст и переменные не имеют значения.

Хорошо, рассмотрим этот простой ввод:На самом деле это может быть любой входной вопрос.

Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
kundenummer = Convert.ToInt16(inputKnr);

Теперь, что, если клиент введет что-то неправильно?Например, письмо.Попытка и перехват позволили бы убедиться, что приложение не сломается, но это не то решение, которое я хочу.Я хочу, чтобы это говорило о том, что вы сделали это неправильно, попробуйте еще раз.Довольно классично, не так ли?

Но каков наилучший способ решить это решение?Я думал об этом:

bool fangetKundenummer = true;
while (fangetKundenummer)
{
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
try
{
    kundenummer = Convert.ToInt16(inputKnr);
    fangetKundenummer = false;
}
catch
{
    Console.WriteLine("Fejl. Prøv igen");
}
}

Но это просто не похоже на правильный способ сделать это.

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

Вы также могли бы написать функцию.Что-то вроде этого (нет причин делать это правильно, это просто для иллюстрации концепции):

static void verifyInput()
{
    try
    {
        Console.WriteLine("question");
        input = Console.ReadLine();
        kundenummer = Convert.ToInt16(input)
    }
    catch
    {
        Console.WriteLine("Wrong. Do it over");
        verifyInput(); //start the function all over
    }
}

Но вам пришлось бы написать функцию для каждого входного вопроса, даже если они могут задавать точно такой же!(имеется в виду, возможно, что все запрашивают целое число;но с другим вопросом и переменной).

Это не кажется намного лучше, чем решение while().

У кого-нибудь есть умная идея?

Это было полезно?

Решение

Использование Int16.Попробуйте проанализировать и эквиваленты для других числовых типов.Все они возвращают логический результат, указывающий на успех или неудачу синтаксического анализа, и принимают out параметр, который устанавливается на результат синтаксического анализа (или 0 в случае сбоя).В вашем случае вы можете обернуть вызов в метод, который будет продолжать выдавать запросы:

static Int16 PromptForInt16(string prompt)
{
    while (true)
    {
        Console.Write(prompt);
        Int16 result;
        if (Int16.TryParse(Console.ReadLine(), out result))
        {
            return result;
        }
        Console.WriteLine("Sorry, invalid number entered. Try again.");
    }
}

Другие советы

Вы можете использовать шаблон TryParse:

string s; // for "is not valid" message
short val; // final value
while(!short.TryParse(s=Console.ReadLine(), out val)) {
    Console.WriteLine(s + " is not valid...");
}

Просто для некоторого разнообразия, как насчет тестирования самой строки вместо TryParse, что потребовало бы дополнительного хранилища и, возможно, ненужного приведения?

static void Main(string[] args)
{
    var isFalse = "t".IsInt();
    var isTrue = "123".IsInt();
    var isAlsoFalse = "123.1".IsInt();

}

static bool IsInt(this IEnumerable<char> s)
{
    return s.All(x => char.IsNumber(x));
}

Вот ссылка, которая может помочь:

http://msdn.microsoft.com/en-us/library/system.int16.tryparse.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top