Есть хороший способ использовать Console.ReadKey для выбора между значениями, не делая много преобразований между типами?
Я использую Console.ReadKey(), чтобы выбрать один из нескольких вариантов, которые время от времени меняются. Перед этим исходным фрагментом кода есть цикл for, который считает вхождения в переменную counter типа int.
Смысл в том, чтобы использовать Console.ReadKey(), чтобы получить int.
int choice = ReadKey();
Console.WriteLine("");
if (choice < counter)
{
mail.to = result[counter-1].email;
}
Используя следующие методы
static int ReadKey()
{
ConsoleKeyInfo choice = Console.ReadKey();
char convertedchoice = choice.KeyChar;
string convertedchoice2 = convertedchoice.ToString();
int result = TryInt(convertedchoice2);
return result;
}
static int TryInt(string totry)
{
while (true)
{
int result;
if (int.TryParse(totry, out result))
{
return result;
}
Console.WriteLine("Sorry, you need to enter a number. Try again.");
}
}
Я попытался использовать ToString(), но это был способ, который позволил мне сделать это в конце. Так что это выглядит неэффективно для меня, и, следовательно, я был бы очень признателен за то, что делать по-другому?
Редактировать:
Я закончил с комбинацией всех хороших ответов ниже. Большое спасибо, ребята.
static int ReadKey()
{
while (true)
{
ConsoleKeyInfo choice = Console.ReadKey();
if (char.IsDigit(choice.KeyChar))
{
int answer = Convert.ToInt32(choice.KeyChar);
return answer - 48; //-48 because 0 is represented in unicode by 48 and 1 by 49 etc etc
}
Console.WriteLine("\nSorry, you need to input a number");
}
}
3 ответа
Для системы меню с вариантами выбора 0,9 это вполне нормально. Не для чтения больших чисел, хотя.
Вся ваша логика проверки может быть значительно упрощена с помощью char.IsDigit():
if char.IsDigit(convertedchoice)
{
int result = convertedchoice - '0'; // char1 - char2 = int, in this case in 0..9
return result;
}
else ...
Вы можете просто позвонить Convert.ToInt32(choice.KeyChar);
непосредственно.
Это немного упростит это.
Есть много способов упростить ваш код, но для начала постарайтесь не помещать все в переменную. В общем такие вещи как:
(a + b + c) / 2
намного легче читать, чем такие вещи, как:
int A_plus_B = a + b
int A_plus_B_plus_C = A_plus_B + c
int answer = A_plus_B_plus_C / 2
Имея это в виду, вы можете написать:
static int ReadKey()
{
while (true)
{
char ch = Console.ReadKey().KeyChar;
int result;
if (int.TryParse(ch.toString(), out result))
{
return result;
}
}
}