2009-08-25 3 views
4

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

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

Сценарий А - петля для

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

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

    //Maybe do work here 
} 

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

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

Недостатки

  • должны использовать, если оставить петли

Сценарий Б - Do/во время цикла

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 
} 

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

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

Недостатки

  • должны управлять счетчик вручную
+2

Интересно, почему все продолжают копировать 'iLoop Blindy

+0

название должно быть изменено, чтобы добавить петлю «while» –

+0

@Luis Filipe - While loop is the title! – stevehipwell

ответ

10

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

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

(где Criteria является «продолжать работать»)

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

+0

Итак, цикл for может реплицировать цикл while без if, но для цикла for нужен if, чтобы реплицировать цикл do! – stevehipwell

+0

и, возможно, даже не писать iLoop ++, потому что критерий может не зависит от iLoop –

+0

Ну, предлагается, чтобы счетчик был необходим, и приятно держать инкремент от «мяса» кода. –

1

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

9

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

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

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

for (int iLoop = 0; !Criterea; iLoop++) 
+0

За исключением того, что он сказал, что может быть некоторая работа, прежде чем проверять критерии. – daphshez

+0

@ Дафна Шезаф: Вы правы, но вам все равно нужно иметь условие if внутри цикла while, если вы хотите выполнить некоторую работу до и после проверки это –

+0

@Firas - Но нет, если вы хотите проверить критерии только после тела цикла (do loop). Мне нравится эта конструкция. – stevehipwell

0

по крайней мере, для меня я использую для(), когда мне нужно пройти через массив и при отсутствии ломка не требуется. И do() и while(), когда мне нужно что-то обрабатывать в течение неизвестного времени.

1

Вы всегда можете добавить критерии выхода в цикл:

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

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

3
for (int iLoop = 0; iLoop < int.MaxValue && !Criteria; iLoop++) { 
    //Do work here... 
} 
1

В этом случае нет причин не использовать петлю for. Даже если у вас есть другие критерии, это вполне допустимо, чтобы написать:

for (int iLoop = 0; iLoop < int.MaxValue && Criteria; iLoop++) { ... } 
1

Лично я бы с цикл.

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

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

Edit: int.MaxValue & & Критерии < - это definietely лучший подход, чем мой начальный один;)

+0

++ iLoop или iLoop ++ не имеет никакого значения в C#, это скомпилируется с тем же IL. Если вы мне не верите, попробуйте. –

+0

-1 за неправильную информацию о ++. В этом случае он никогда не создавал бы временную переменную (и почти никогда вообще не был). – Blindy

+0

Я не согласен; операторы с предварительным приращением относительно редки, а в C# нет ощутимого улучшения производительности. Вы добавляете неопределенность/путаницу без причины. –

1

для петель состоят из следующих:

for (initialization; condition; action) 

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

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

3

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

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

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

    // do work here 

} 

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

{ 
    int iLoop = 0; 
    while (Criteria) { 

     // do work here 

     iLoop++; 
    } 
} 

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

1

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

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

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

1

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

для цикла может выполнить блок кода для фиксированного или заданного числа times.if переменной счетчика зависит от того блока кода (средства внутри петлевого состояния), вы можете использовать цикл

Смежные вопросы