Какой цикл использовать, для или делать / в то время как? - PullRequest
4 голосов
/ 25 августа 2009

Используя C # (или VB.NET), какой цикл (для цикла или цикла do / while) следует использовать, когда требуется счетчик?

Имеет ли значение, если цикл должен повторяться только заданное количество раз или через заданный диапазон?

Сценарий A - цикл for

for (int iLoop = 0; iLoop < int.MaxValue; iLoop++)
{
  //Maybe do work here

  //Test criteria
  if (Criteria)
  {
    //Exit the loop
    break;
  }

  //Maybe do work here
}

Преимущества

  • Счетчик объявлен как часть цикла
  • Простота реализации диапазона счетчиков

Недостатки

  • Должен использовать, если выйти из цикла

Сценарий B - цикл do / while

int iLoop = 0;
do
{
  //Increment the counter
  iLoop++;

  //Do work here
} while (Criteria);

или

int iLoop = 0;
while (Criteria)
{
  //Increment the counter
  iLoop++; 

  //Do work here 
}

Преимущества

  • Выход из цикла является частью структуры цикла
  • Выбор для оценки до или после блока цикла

Недостатки

  • Нужно управлять счетчиком вручную

Ответы [ 13 ]

10 голосов
/ 25 августа 2009

Просто для полноты вы можете также использовать опцию D:

for (int iLoop = 0; Criteria; iLoop++)
{
   // work here
}

(где Criteria означает "продолжать работать")

условие в for цикле не должно включать iLoop. Необычно, но довольно мило - оценивает только до работы

9 голосов
/ 25 августа 2009

Как насчет лучшего из обоих миров:

for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++)

Редактировать: Теперь, когда я думаю об этом, я полагаю, что сравнение с int.MaxValue не было частью критериев, но что-то для эмуляции бесконечного цикла for, в этом случае вы могли бы просто использовать:

for (int iLoop = 0; !Criterea; iLoop++)
3 голосов
/ 25 августа 2009

Вместо фиктивных критериев в цикле for вы можете использовать фактические критерии, которые вы хотите использовать для цикла:

Сценарий A2 - цикл for с пользовательскими критериями:

for (int iLoop = 0; Criteria; iLoop++) {

  // do work here

}

Это эквивалентно:

{
   int iLoop = 0;
   while (Criteria) {

      // do work here

      iLoop++;
   }
}

Если у вас есть счетчик циклов, вы, как правило, должны использовать цикл for, чтобы сделать это более понятным.

3 голосов
/ 25 августа 2009
for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++) {
    //Do work here...
}
1 голос
/ 25 августа 2009

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

Цикл for может выполнять блок кода в течение фиксированного или заданного числа раз. Если ваша переменная счетчика зависит от этого блока кода (значит, внутри условия цикла), вы можете использовать цикл for

1 голос
/ 25 августа 2009

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

Если я зацикливаюсь на чем-то с неизвестной длиной, например на строках в файле, или просто поддерживаю счетчик для использования итогового значения после цикла, тогда я буду использовать do или while.

Однако, это действительно сводится к тому, что более читабельно для конкретной ситуации. Я ожидаю, что вы с трудом сможете узнать из скомпилированного IL, какая версия использовалась.

1 голос
/ 25 августа 2009

Напишите несколько тестовых случаев и посмотрите, какие из них лучше всего подходят для вас. Посмотрите эту ссылку: .Net / C # Loop Performance Test (FOR, FOREACH, LINQ и Lambda)

1 голос
/ 25 августа 2009

для циклов состоит из следующего:

for ( initialization; condition; action )

вам не нужно дополнительно, если вы проверяете свои критерии, что вы думаете i < value? это не более чем критерий.

я использую циклы, когда они подходят к задаче, однозначного ответа нет

1 голос
/ 25 августа 2009

Лично я бы пошел с для цикла .

Лучше читать, чаще использовать и очень оптимизировать.

for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++)
{
// Do Work
}

Edit: int.MaxValue &&! Criteria <- определенно лучший подход, чем мой первоначальный;) </p>

1 голос
/ 25 августа 2009

Нет причин не использовать цикл for в этом случае. Даже если у вас есть другие критерии, совершенно правильно написать:

for (int iLoop = 0; iLoop < int.MaxValue && Criteria; iLoop++) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...