Есть хороший способ использовать 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;
        }
    }
}
Другие вопросы по тегам