Как вставить несколько условий в цикл while - PullRequest
0 голосов
/ 11 июля 2019

Я хочу использовать несколько условий в цикле while:

Console.WriteLine("Select an action to perform\n");
int n1 = Convert.ToInt32(Console.ReadLine());
do
{
    Console.WriteLine("Insert a valid method\n");
    n1 = Convert.ToInt32(Console.ReadLine());
}
while ((n1 == 1) || (n1 == 2));

Console.WriteLine(n1);
Console.ReadKey();

Здесь я хочу проверить, что value n1 равно 1 или 2. До тех пор, пока пользователь не введет n1 или 2, это должно зациклиться.Дело в том, что я могу заставить это работать, если я использую только одно условие, но не могу заставить это работать, когда есть 2 условия.Кроме того, как сравнить эти значения с другой строкой?

Пример:

while ((n1 == "one") || (n1 =="two"))

Я думаю, что есть кое-что, что я не понял в || (OR) operator.Я прочитал несколько решений, но я не мог понять это.

Ответы [ 4 ]

1 голос
/ 11 июля 2019

Вы путаете do....while с do...until (последний из которых не является конструкцией c #).

Если вам нужен логический цикл типа «до», используйте while(true) и оператор if с условием до, чтобы разорвать цикл.

Console.WriteLine("Select an action to perform\n");
int n11 = Convert.ToInt32(Console.ReadLine());
while (true)
{
    Console.WriteLine("Insert a valid method\n");
    n1 = Convert.ToInt32(Console.ReadLine());
    if ((n1 == 1) || (n1 == 2)) break;
}

Альтернативой является сохранение конструкции while, но инвертирование логики. Это не мой любимый ответ, потому что он может сделать логику менее ясной.

Console.WriteLine("Select an action to perform\n");
int n11 = Convert.ToInt32(Console.ReadLine());
do
{
    Console.WriteLine("Insert a valid method\n");
    n1 = Convert.ToInt32(Console.ReadLine());
}
while ((n1 != 1) && (n1 != 2));
1 голос
/ 11 июля 2019

Вы хотите, чтобы это зациклилось , пока пользователь не введет 1 или 2 .

Но в коде вы попросили его зациклить , когда пользователь вводит 1 или 2 .

Таким образом, вместо

while ((n1 == 1) || (n1 == 2));

вы должны написать

while (!(n1 == 1 || n1 == 2));

Оставшаяся часть кода хороша, она будет работать как положено.

Нет необходимости проверять строки «one» и «two» при преобразовании ввода в Int32 в строке 6. Convert.ToInt32(Console.ReadLine()) не может преобразовать string «one» в Integer '1».

0 голосов
/ 11 июля 2019

Я предлагаю использовать бесконечный цикл while(true) {...}, который мы break на допустимом вводе (пожалуйста, обратите внимание int.TryParse вместо Convert.ToInt32 - мы не хотим исключение на входе типа "bla-bla-bla"):

// Let's be nice and show expected user response - 1 or 2
Console.WriteLine("Select an action to perform (1, 2)\n");

int n1;

while (true) {
  // If user input is a valid i.e.
  //   1. Input is valid integer - int.TryParse returns true
  //   2. User input is either 1 or 2
  // we break the loop and start business logic; otherwise keep asking  
  if (int.TryParse(Console.ReadLine(), out n1) && ((n1 == 1) || (n1 == 2)))
    break;

  // Again, let's be nice and help user
  Console.WriteLine("Insert a valid method (either 1 or 2)\n"); 
}

Console.WriteLine(n1);
Console.ReadKey();
0 голосов
/ 11 июля 2019

Ваш текущий код такой:

while ((n1 == 1) || (n1 == 2))

Этот код указывает, что цикл следует повторить / продолжить, если n1 == 1 или n1 == 2.На самом деле вы хотите повторить, где n1 не равно ни одному из них:

while (n1 != 1 && n1 != 2)

Это означает, что если n1 не 1, а n1 не2, тогда оно должно зацикливаться.Если это утверждение неверно, цикл завершится, и ваш код переместится на Console.WriteLine(n1);.

Обратите внимание, что n1 != 1 && n1 != 2 противоположно n1 == 1 || n1 == 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...