2012-05-28 1 views
6

Поэтому у меня есть эти несколько строк кода:C# рестарт для цикла

string[] newData = File.ReadAllLines(fileName) 
int length = newData.Length; 
for (int i = 0; i < length; i++) 
{ 
    if (Condition) 
    { 
     //do something with the first line 
    } 
    else 
    { 
     //restart the for loop BUT skip first line and start reading from the second 
    } 
} 

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

Итак, как я могу перезапустить цикл и изменить стартовую строку (получение другого ключа из массива)?

+0

Если условие истинно вы хотите прочитать только первую строку, и если условие ложно, то только для чтения из строки 2 до конца ? – Steve

+2

Также обратите внимание, что ваш 'i <= newData.Length' должен быть' <'. – Rawling

+0

@ Rawling отредактировал –

ответ

9

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

int i = 0; 
while(i < newData.Length) 
{ 
    if (//Condition) 
    { 
     //do something with the first line 
     i++; 
    } 
    else 
    { 
     i = 1; 
    } 
} 
+1

Но это просто уродливое отформатированное для цикла .... Согласился, что OP должен делать покупки еще кое-что. –

+2

Нет, это замкнутая петля. Да, вы могли бы сделать это с помощью цикла for, но я бы счел его запахом кода. Для _implies_ делать что-то несколько раз или для нескольких шагов. Это не то, что делает этот цикл. –

+1

+1, потому что я не глухой! :) для цикла, который возвращается, является ужасным кодом. – gdoron

7

Просто измените index из цикла:

for (int i = 0; i < newData.Length; i++) // < instead of <= as @Rawling commented. 
{ 
    if (//Condition) 
    { 
     //do something with the first line 
    } 
    else 
    { 
     // Change the loop index to zero, so plus the increment in the next 
     // iteration, the index will be 1 => the second element. 
     i = 0; 
    } 
} 

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

+3

'i = 1', действительно? – Rawling

+1

@ Rawling. вы правы, исправлены. Благодарю. – gdoron

+0

Приветствия, -1 отменен. – Rawling

4

Просто установите i = 0 в своем заявлении else; i++ в объявлении цикла должен установить его на 1 и таким образом пропустить первую строку.

+0

Он хочет, чтобы я был 0. его лучший выбор - изменить размер массива. –

0
string[] newData = File.ReadAllLines(fileName) 

for (int i = 0; i <= newData.Length; i++) 
{ 
    if (//Condition) 
    { 
     //do something with the first line 
    } 
    else 
    { 
     //restart the for loop BUT skip first line and start reading from the second 
     i = 0; 
    } 
} 
+2

Опять же, 'i = 1'? – Rawling

0

Вы просто сбросить i и изменить размер массива

int length = newData.Length; // never computer on each iteration 
for (int i = 0; i < length; i++) 
{ 
    if (condition) 
    { 
     //do something with the first line 
    } 
    else 
    { 
     // Resize array 
     string[] newarr = new string[length - 1 - i]; 
     /* 
     * public static void Copy(
     * Array sourceArray, 
     * int sourceIndex, 
     * Array destinationArray, 
     * int destinationIndex, 
     * int length 
     *) 
     */ 
     System.Array.Copy(newData, i, newarr, 0, newarr.Length); // if this doesn't work, try `i+1` or `i-1` 
     // Set array 
     newData = newarr; 
     // Restart loop 
     i = 0; 
    } 
}