2015-11-25 1 views
2

Это мой текущий код:Укорачивание для цикла с тем, если заявления - C#

for(int i = 1; i < 13; i + 4) 
{ 
    do something 
} 
for (int i = 2; i <13; i + 4) 
{ 
    do something 
} 

И так далее для каждого значения I.

Я хотел бы мой цикл, чтобы сделать следующее без необходимости выписывать каждое отдельное значение:

for(int i = 1; i < 13; i++) 
{ 
    if(i is 1,5,9) 
    { 
     do something 
    } 
    if(i is 2,6,10) 
    { 
     do something 
    } 

сделайте что-то есть, например, изменить текст текстового поля.

спасибо.

+2

[CodeReview.SE]? –

+0

@ SonerGönül, ну этот код не работает. И Code Review хочет работать с кодом. Так что нет, я бы не рекомендовал Code Review. – Emz

+1

Каков ваш реальный вопрос? Да, вы можете делать то, что хотите. – Emz

ответ

3

Посмотрите на то, что критерии имеют в общем; все они по модулю на 4 то же самое:

for(int i = 1; i != 13; ++i) 
{ 
    switch(i % 4) 
    { 
    case 1: 
     // first do something 
     break; 
    case 2: 
     // second do something 
     break; 
    case 3: 
     // third do something 
     break; 
    case 0: 
     // fourth do something 
     break; 
    } 
} 

Альтернативный подход заключается в увеличиваем внутри цикла:

for(int i = 1; i != 13; ++i) 
{ 
    // first do something 
    ++i; 
    // second do something 
    ++i; 
    // third do something 
    ++i; 
    // fourth do something 
} 

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

+0

Благодарим за помощь! :) –

2

Возможно, вы ищете оператора деления % в сочетании с оператором switch следующим образом.

for(int i = 1; i < 13; i++) 
{ 
    switch(i % 4) 
    { 
     case 0: 
      do stuff; 
      break; 
     case 1: 
      do stuff; 
      break; 
     case 2: 
      do stuff; 
      break; 
     case 3: 
      do stuff; 
      break; 
    } 
} 
+0

И это будет работать для каждого основного значения для i? i = 1 do a, i = 2 do b, i = 3 do c, i = 4 do d, i = 5 do a, i = 6 do b и т. д. –

+0

@TomPitts Возможно, вы захотите переместить 'case 0', так как это тот, который работает для кратных 4, но да, он будет работать для всех значений' i'. – juharr

+0

@Tom Вот как работает оператор modulo. Если вы делаете '7% 4',' 11% 4' и т. Д., То это эквивалентно остатку после деления '7/4',' 11/4' и т. Д., Что равно '3'. –

2

Вы можете использовать Contains:

for(int i = 1; i < 13; i++) 
{ 
    if(new[]{1,5,9}.Contains(i)) 
    { 
     // do something 
    } 
    if(new[]{2,6,10}.Contains(i)) 
    { 
     // do something else 
    } 
} 
+0

Проблема у меня в том, что мой цикл for на самом деле: i <32. Не хочу писать каждый из них. –

+0

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

+0

@TomPitts: поскольку вы не описали свою логику в своем вопросе, я представил общий подход. Если логика похожа на [Codor's answer] (http://stackoverflow.com/a/33917610/284240), вы должны использовать этот подход.Кроме того, Джон Ханна прав, вы должны объявить массивы перед циклом. Я просто хотел показать эту идею. –

1

Вот простой способ, не делая его больше ...

for(int i = 1; i != 13; ++i) 
{ 
    if ((i - 1) % 4 == 0) 
    { 
     //i is 1, 5, 9, etc. 
    } 
    else if ((i - 2) % 4 == 0) 
    { 
     //i is 2, 6, 10 
    } 
} 
+0

И я могу сделать это для if ((i-3)% 4 == 0), так что i = 3 сделает что-то другое, чем i = 1 и i = 2? –

+0

Да, это так. –

+0

@TomPitts, если вам нужно обрабатывать все четыре оставшихся случая, вы также можете просто «if (i% 4 == 1)», 'if (i% 4 == 2)', 'if (i% 4 = = 3) 'и' if (i% 4 == 0) ' – juharr

0

Я хотел бы сделать что-то вроде этого:

int[] valuesForTheFirstIf = new int[] { 1, 5, 9 }; 
int[] valuesForTheSecondtIf = new int[] { 2, 6, 10 }; 

for (int i = 0; i < 13; i++) 
{ 
    if (valuesForTheFirstIf.Contains(i)) 
    { 
     // do something 
    } 
    if (valuesForTheSecondtIf.Contains(i)) 
    { 
     // do something 
    } 
} 
Смежные вопросы