Есть ли хороший способ использовать Console.ReadKey для выбора между значениями без большого преобразования между типами? - PullRequest
1 голос
/ 16 марта 2009

Я использую 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 (), но это было способом, который позволил мне сделать это в конце. Так что это выглядит неэффективно для меня, и, следовательно, я был бы очень признателен за то, что делать по-другому?

Edit:

Я закончил с комбинацией всех хороших ответов ниже. Большое спасибо, ребята.

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 ]

4 голосов
/ 16 марта 2009

Для системы меню с вариантами выбора 0,9 это вполне нормально. Не для чтения больших чисел.

Вся логика проверки может быть значительно упрощена с помощью char.IsDigit ():

if char.IsDigit(convertedchoice)
{
  int result = convertedchoice - '0';    // char1 - char2 = int, in this case in 0..9
  return result;
}
else ...
1 голос
/ 16 марта 2009

Вы можете просто позвонить Convert.ToInt32(choice.KeyChar); напрямую.

Это немного упростит.

0 голосов
/ 16 марта 2009

Есть много способов упростить ваш код, но для начала постарайтесь не помещать все в переменную. В общем такие вещи как:

(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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...