Loopar och iteration
↑Exemplen är oberoende C#-utdrag för moderna .NET-konsolprojekt, om inget annat anges. Klassdeklarationer och toppnivåkod kan placeras i samma Program.cs-fil, med toppnivåkoden först.
Snabböversikt
Section titled “Snabböversikt”Loopar upprepar arbete. Välj for när du behöver index, foreach för element och while när repetitionen styrs av ett villkor.
Så fungerar det
Section titled “Så fungerar det”For-loopar och index
Section titled “For-loopar och index”En for-loop består av initiering, villkor och uppdatering. Index i en array börjar på 0 och slutar på Length - 1.
int[] scores = { 12, 19, 25 };for (int i = 0; i < scores.Length; i++) Console.WriteLine($"Index {i}: {scores[i]}");Foreach jämfört med while
Section titled “Foreach jämfört med while”foreach går igenom alla element utan manuell indexhantering. while testar villkoret före varje varv, medan do while alltid kör kodblocket minst en gång.
int total = 0;foreach (int score in new[] { 10, 20, 30 }) total += score;int countdown = 3;while (countdown > 0) countdown--;Console.WriteLine(total); // 60Break och continue
Section titled “Break och continue”break lämnar den närmaste loopen, medan continue hoppar till nästa varv. De är användbara men kan göra flödet svårare att följa om de används för ofta.
foreach (int value in new[] { -1, 2, 0, 7 }){ if (value < 0) continue; if (value == 0) break; Console.WriteLine(value); // prints 2 only}Fördjupning: resonera om framsteg och avslut
Section titled “Fördjupning: resonera om framsteg och avslut”Varje loop behöver ett avslut
Section titled “Varje loop behöver ett avslut”En loop upprepar arbete så länge villkoret gäller. För en while-loop ska du kunna peka ut starttillståndet, villkoret och vad som till slut gör det falskt. Utan den förändringen kan du få en oändlig loop. En for-loop visar ofta alla tre delarna på samma rad och passar när du arbetar med ett känt indexintervall.
int[] scores = { 10, 20, 30 };int total = 0;for (int i = 0; i < scores.Length; i++){ total += scores[i];}Console.WriteLine(total); // 60Under indexeringen gäller 0 <= i < scores.Length. Villkoret får inte tillåta scores.Length eftersom det största giltiga indexet är ett mindre än arrayens längd. Det klassiska off-by-one-felet uppstår när man råkar använda <= i stället för <.
Välj for, foreach eller while
Section titled “Välj for, foreach eller while”for passar när index eller egen steglängd behövs, foreach när du bara vill läsa varje värde och while när antalet upprepningar inte är känt från början. do ... while kör kroppen minst en gång. I foreach kan du inte bara tilldela om iterationsvariabeln och du bör inte ändra en vanlig List<T> samtidigt som den itereras via sin enumerator.
break, continue och tidiga returer
Section titled “break, continue och tidiga returer”break lämnar den närmaste loopen och continue går vidare till nästa varv. return lämnar hela metoden. Det kan göra avslut tydliga, men många nästlade avbrott gör det svårt att se vilka data som faktiskt har behandlats.
Komplexitet och prestanda
Section titled “Komplexitet och prestanda”Att gå igenom n värden en gång tar vanligen O(n) tid. Två nästlade loopar som går igenom hela datamängden kan kräva O(n²) operationer. Detta märks för stora samlingar och kod som körs i Unity varje bildruta. Förbättra algoritmen innan du jagar små prestandavinster och undvik onödig allokering i täta loopar.
När och varför?
Section titled “När och varför?”Välj foreach för enkel genomgång av samlingar och for när indexet spelar roll.
Vanligt misstag
Section titled “Vanligt misstag”Se till att en while-loop kan avslutas. Ändra inte en samlings struktur under en vanlig foreach.
Testa själv
Section titled “Testa själv”Summera alla positiva värden i en array och hoppa över negativa.
Visa ett lösningsförslag
foreach (int n in numbers) { if (n < 0) continue; sum += n; }.
