c # reporniți pentru bucla

Deci, am aceste câteva linii de cod:

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
    }
}

Am încercat cu Got, dar, după cum puteți vedea, dacă încep din nou buclă, va începe de la prima linie.

Deci, cum pot să repornez buclă și să schimb linia de pornire (primirea unei chei diferite din matrice)?

0
Rețineți, de asemenea, că i <= newData.Length trebuie să fie <.
adăugat autor Rawling, sursa
Dacă este adevărat, fac o treabă acolo cu acea primă linie și apoi cu a doua și etc.
adăugat autor Kirev, sursa
@Rawling editat
adăugat autor Cole Johnson, sursa
Dacă condiția este adevărată, doriți doar să citiți prima linie și dacă condiția este falsă, atunci citiți numai de la linia 2 până la capăt?
adăugat autor Steve, sursa

5 răspunsuri

Doar setați i = 0 în instrucțiunea else ; i ++ din declarația de buclă ar trebui apoi să-l setați la 1 și astfel să săriți peste primul rând.

0
adăugat
Vrea să fiu 0. Cel mai bun pariu este să redimensionez matricea
adăugat autor Cole Johnson, sursa
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;
    }
}
0
adăugat
Din nou, i = 1 ?
adăugat autor Rawling, sursa

Doar modificați indicele al buclului for:

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;
    }
}

Rețineți că acest lucru arată ca un excelent cod de spaghete ... Schimbarea indexului unei bucline de obicei indică faptul că faceți ceva greșit.

0
adăugat
Noroc, -1 abținut.
adăugat autor Rawling, sursa
Rescinded înseamnă preluat/eliminat :)
adăugat autor Rawling, sursa
i = 1 , într-adevăr?
adăugat autor Rawling, sursa
Da, dar dacă acesta nu reușește pe a doua linie, va continua să citească al doilea și să meargă la 3, 4, etc. Practic, trebuie să citesc fiecare linie următoare dacă condiția nu reușește. Ca: prima linie este newData [0], a doua este newData [1] Trebuie să repornez bucla și să schimb noulData [i] de fiecare dată. PS: Îmi pare rău pentru engleza mea rea
adăugat autor Kirev, sursa
Și da. Cred că este o mare greșeală de folosit pentru buclă aici. Voi încerca să rezolv asta.
adăugat autor Kirev, sursa
@Rawling. Nu ți-a trecut ultimul comentariu. ce ai vrut sa spui?
adăugat autor gdoron, sursa
@Rawling. aveți dreptate, fixați. Mulțumiri.
adăugat autor gdoron, sursa
+1 pentru spaghete. Au susținut că o buclă nu este potrivită aici, dar se pare că se încadrează pe urechi surde :)
adăugat autor Binary Worrier, sursa

Ați reseta doar i și ați redimensionat matricea

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;
    }
}
0
adăugat

Aș susține că un pentru buclă este un tip greșit de buclă aici, nu exprimă în mod corect intenția buclă și mi-ar sugera cu siguranță că nu vei muri cu contorul.

int i = 0;
while(i < newData.Length) 
{
    if (//Condition)
    {
       //do something with the first line
       i++;
    }
    else
    {
        i = 1;
    }
}
0
adăugat
Acest răspuns a fost soluția în cazul meu. Mulțumesc!
adăugat autor Kirev, sursa
+1, cuz eu nu sunt surd! :) pentru bucla care se întoarce este un cod îngrozitor.
adăugat autor gdoron, sursa
La naiba, aș vrea să pot adăuga acest comentariu de mai multe ori!
adăugat autor gdoron, sursa
Cel puțin OP nu este surd. :)
adăugat autor gdoron, sursa
Dar acest lucru este doar un format urât pentru buclă .... Sunt de acord că OP ar trebui să facă cumpărături pentru altceva.
adăugat autor Henk Holterman, sursa
Nu, este o buclă. Da, ai putea să o faci cu un buclă, dar aș considera un miros de cod. Pentru implică efectuarea unui lucru de câteva ori sau pentru un număr de pași. Nu asta face buclele.
adăugat autor Binary Worrier, sursa
@ Nu cred că mă auziți. Nu contează (și nu-mi pasă) că cele două bucle sunt echivalente, atunci când cineva citește codul, este probabil să respingă versiunea pentru ca fiind de câteva ori fără a prinde modificarea îngropată a i . Aș susține că este simplitatea aparentă a , în timp ce condiția este ceea ce îl face un drapel cititorului pentru a verifica dacă acest lucru nu este la fel de simplu cum arată. IMHO structura din versiunea pentru nu este luată în calcul pentru a vă submina pentru și structura sa prin ruperea ca
adăugat autor Binary Worrier, sursa
@ Kirev: Mă bucur să fiu de ajutor :)
adăugat autor Binary Worrier, sursa