Лучший способ проверить ввод строки чтения в C #?
Вопрос
О, 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