Как я могу заменить оператор if на троичный оператор? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь заменить обычный оператор if на троичный оператор, но он не компилируется.Сначала я хотел бы проверить, является ли ввод числом, если true, затем назначить Student.ID для ввода, если false, затем попросить пользователя повторить попытку.

Мой код:

(Int32.TryParse(Console.ReadLine().Trim().ToLower())) ? student.ID : Console.WriteLine("id isn't a number, try again");

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Пока я читаю, вы хотите что-то вывести, если анализ не удастсяЭто нельзя превратить в троицу.

Есть много вещей, которые не так с вашим кодом:

  • Сдачи только для условных заданий.У вас нет переменной, которой вы назначаете что-либо.
  • вы никогда не давали TryParse выходной параметр, означающий, что компилятор не может выяснить, какую функцию даже вызвать там
  • Оба варианта троичного должны соответствовать типу, который вы выполняете.Console.WriteLine возвращает void, который, вероятно, не соответствует типу, который будет у вас для Stundent.ID (я предполагаю целое число).

Таким образом, есть по крайней мере 3 причины, по которым это невозможно скомпилировать.

Просто держите его в рабочем блоке if / else.Если вы хотите попробовать троичные, делайте такие вещи, как применение верхней / нижней границы для значения.Вот для чего он предназначен.Редко вы используете его для работы по инициализации (если == null, создайте новый экземпляр. В противном случае укажите значение).

Редактировать: я просто перечитал и заметил, что назначение не является обязательным.Это просто очень, очень распространенный вариант использования.И в этом случае оба результата (или их возвращаемое значение) должны соответствовать переменной.

0 голосов
/ 20 сентября 2019

Кристофер достаточно хорошо ответил на вопрос, поэтому я не буду повторять его здесь.

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

Например:

private static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
{
    int result;
    var cursorTop = Console.CursorTop;

    do
    {
        ClearSpecificLineAndWrite(cursorTop, prompt);
    } while (!int.TryParse(Console.ReadLine(), out result) ||
             !(validator?.Invoke(result) ?? true));

    return result;
}

private static void ClearSpecificLineAndWrite(int cursorTop, string message)
{
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(message);
}

Теперь мы можем вызывать этот метод в нашей основной программе и не беспокоиться о проверке - наш основной код намного чище.

Например, скажем, номер студента должен быть длиной 5 цифр, мы могли бы сделать что-то вроде:

int studentId = GetIntFromUser("Enter a 5-digit student id: ", x => x > 9999 && x < 100000);
...