построение цикла FOR с несколькими IF и его остановка только в некоторых прогонах - PullRequest
1 голос
/ 12 декабря 2011

У меня есть двумерный массив, некоторые его члены являются числами (playerID -1,2,3,4 и т. Д.), А остальные - нулями.

Я хочу создать цикл for, содержащий все виды методов проверки, который проходит через цикл и возвращает ответ. проверки ранжируются, так что когда одна из более высоких проверок возвращается в значение ИСТИНА, цикл для этого идентификатора игрока может завершиться. Позже я хочу использовать результаты проверки для сравнения между игроками, но первым делом - я не могу запустить большой цикл FOR.

Я имел в виду что-то вроде этого:

for (int playerID = 1; playerID <= participants; playerID++)
{
    checkA = Check4forsequenceof4(matrix); //method A
    if (checkA == 0)
        continue;
    else
        Console.WriteLine(p + "completed check A");
        break;
    if (checkB == 0)
       continue;
    else
        Console.WriteLine(p + "completed check B");
        break;
    if (checkC == 0)
       continue;
    else
        Console.WriteLine(p + "completed check C");
        break;
}

Проблемы заключаются в следующем: прерывание прерывается из цикла FOR, а не только из if, и я не могу придумать, как проверить следующий playerID, а также не могу понять, как лучше сохранить результаты для каждый игрок для последующего отображения.

Ответы [ 7 ]

5 голосов
/ 12 декабря 2011

Прежде всего, если вы хотите, чтобы эта работа работала, вы не можете полагаться на отступы - вам нужны скобки:

        if (checkA == 0)
            continue;
        else
        {
            Console.WriteLine(p + "completed check A");
            break;
        }

Это решит вашу непосредственную проблему немедленного разрыва цикла.

При этом, учитывая вышеупомянутую проверку, вы НИКОГДА не будете проверять наличие B. Я подозреваю, что вы хотите инвертировать свою логику следующим образом:

        if (checkA != 0)
        {
            Console.WriteLine(p + "completed check A");
            break;
        }

Это приведет к запуску checkA, а затемчек и т. д.

1 голос
/ 12 декабря 2011
var allPlayers = new List<Player>();
// Fill the list allPlayers here.

var validPlayers = new List<Player>();
foreach (Player p in allPlayers) {
   if(CheckA(p) || CheckB(p) || CheckC(p)) {
       validPlayers.Add(p);
   }
}

Примечание: c # выполняет так называемую оценку короткого замыкания. То есть если CheckA возвращает true, остальные не будут оцениваться. Если CheckB возвращает true, тогда CheckC не будет оцениваться. Кстати "||" это логическое ИЛИ. Если все проверки должны быть в порядке, используйте вместо них логическое И "&&". Здесь c # прекратит проверку, как только проверка завершится неудачей.

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

Мой ответ может быть не очень уместным, но я не совсем уверен, что вы пытаетесь сделать.

1 голос
/ 12 декабря 2011

У вас гораздо большая проблема. Ваш код гласит:

        checkA = Check4forsequenceof4(matrix); //method A
        if (checkA == 0)
            continue;
        else
            Console.WriteLine(p + "completed check A");
            break;

Это всегда прерывается из цикла в первый раз checkA не равно 0. Таким образом checkB никогда не будет выполнено.

Я не уверен, что ты пытаешься сделать. Отступы вашего кода указывают, что break нигде не нужен, поскольку по умолчанию используется значение tao fall (я думаю, это то, что вы хотите сделать).

0 голосов
/ 13 декабря 2011

Я придумал следующий код.

// This store all of the checks formed as Fun<Player, bool> delegates.
var checks = new List<Func<Player, bool>>();

checks.Add(x => DoesPlayerSatisfyCheck1(x));
checks.Add(x => DoesPlayerSatisfyCheck2(x));
checks.Add(x => DoesPlayerSatisfyCheck3(x));
// Add more checks here if necessary.

// This stores all players who have passed a check.
// The first check that passed will be associated with that player.
var results = new Dictionary<Player, int>();

// Loop through all players.
foreach (Player p in participants)
{
  // Now perform each test in order.
  for (int i = 0; i < checks.Count; i++)
  {
    Func<Player, bool> checker = checks[i];
    if (checker(p))
    {
      results.Add(p, i);
      break;
    }
  }
}

После выполнения этого кода структура данных results будет содержать запись для каждого Player, прошедшего одну из проверок. Эта запись также будет содержать номер чека. Если вы хотите добавить больше проверок позже, вы можете просто добавить их в структуру данных checks.

Этот код не ведет себя так, как вы отправили. Но он ведет себя в соответствии с требованиями, которые вы дали; так или иначе, насколько я могу судить.

0 голосов
/ 12 декабря 2011

Перестройте ваши операторы if ...

if (0 != checkValue) {
  Console.WriteLine(p + " completed check X");
  Continue;
}

Так что это приведет к тому, что цикл перейдет к следующей итерации, когда значение проверки не равно нулю.

Нет такоговещь, как выход из оператора if.

0 голосов
/ 12 декабря 2011

, если я не понимаю ваш вопрос:

for (int playerID = 1; playerID <= participants; playerID++)
        {
            checkA = Check4forsequenceof4(matrix); //method A
            if (checkA != 0)
                 Console.WriteLine(p + "completed check A");
            else
                 continue;

            if (checkB != 0)
               Console.WriteLine(p + "completed check B");
             else
                 continue;

            if (checkC != 0)
               Console.WriteLine(p + "completed check C");
             else
                 continue;

        }
0 голосов
/ 12 декабря 2011

Я думаю, это то, что вы ищете.Хотя я не знаю, когда должен быть установлен checkB или C.После проверкиПроверьте?

for (int playerID = 1; playerID <= participants; playerID++)
{
    checkA = Check4forsequenceof4(matrix); //method A
    if (checkA == 0)
        continue;

    Console.WriteLine(p + "completed check A");

    if (checkB == 0)
        continue;
    Console.WriteLine(p + "completed check B");

    if (checkC == 0)
            continue;
    Console.WriteLine(p + "completed check C");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...