Grunderna — for, while, do-while

Vad är en loop?

Tänk dig att du ska skriva ut räknetabellen för 3. Du skulle kunna skriva tio separata Console.WriteLine-rader. Men vad händer när du behöver 100 rader? Eller 10 000? Att copy-pasta kod är inte programmering — det är ett tecken på att det finns ett bättre sätt.

En loop låter dig köra samma kodblock upprepade gånger, med ett variabelt värde som ändras för varje varv. Det är ett av de kraftfullaste verktygen i programmering, och du kommer använda det i nästan varje program du skriver.


while — körs medan villkoret är sant

while är den enklaste loopen. Innan varje varv kontrolleras ett villkor. Är det sant körs blocket. Är det falskt stannar loopen.

int countdown = 5;
while (countdown > 0)
{
Console.WriteLine("T minus " + countdown + "...");
countdown--;
}
Console.WriteLine("Liftoff!");

Loopen fortsätter så länge countdown > 0 är sant. För varje varv minskar countdown-- värdet med ett. När det når noll är villkoret falskt och loopen stannar.

flowchart TD
    A[countdown = 5] --> B{countdown > 0?}
    B -->|Ja| C[Skriv ut countdown]
    C --> D[countdown--]
    D --> B
    B -->|Nej| E[Skriv: Liftoff!]
    E --> F[Slut]

Oändlig loop — faran med while

Vad händer om du glömmer nedräkning--? Villkoret är alltid sant — loopen kör för evigt. Det kallas en oändlig loop och är ett av de vanligaste misstagen för nybörjare.

// Varning: detta är ett exempel på ett fel
int countdown = 5;
while (countdown > 0)
{
Console.WriteLine("T minus " + countdown + "...");
// countdown-- saknas — loopen stannar aldrig
}

Programmet låser sig och måste avslutas med tvång. Kontrollera alltid att din loop har ett sätt att nå sitt slutvillkor.

En variant av samma misstag: räknaren rör sig åt fel håll.

// Varning: detta är ett exempel på ett fel
int check = 5;
while (check > 0)
{
check++; // borde vara check-- — nu ökar värdet bort från 0, aldrig mot det
Console.WriteLine($"Checking {check}");
}

Villkoret check > 0 är alltid sant eftersom check bara blir större. Resultatet är detsamma — en oändlig loop — men orsaken är subtilare: koden ändrar räknaren, men i fel riktning.

En verklig oändlig loop — potatisskalning 1995

Det här hände på riktigt, långt innan jag undervisade i programmering. Jag jobbade i en lokal för film- och reklamproduktion som delade hus med en restaurang. En dag skar sig kocken i fingret och kunde inte skala potatis. Jag hade inte mycket för mig just då, så jag erbjöd mig att hjälpa till — fick en bunke vatten och en säck potatis, och satte igång.

Sen försvann jag helt in i mina egna tankar. Om man skulle skriva om det som kod hade det sett ut ungefär så här:

while (SäckenHarPotatis())
{
SkalaPotatis();
}

Villkoret var “så länge det finns potatis kvar” — men ingen hade sagt hur mycket det faktiskt skulle vara. En timme senare kom kocken och köksansvarig springande: “Stopp! Du skulle inte skala så mycket!” Men eftersom ingen hade angett ett antal eller ett tydligt slutvillkor hade loopen bara fortsatt, varv efter varv, tills någon utifrån stoppade den — precis som break; avbryter en while-loop utifrån, snarare än att villkoret själv blir falskt.

Resten av veckan serverade köket potatisrätter.

Moralen: en loop utan ett tydligt slutvillkor stannar inte av sig själv — den kör tills något annat avbryter den. Bäst att vara den som skriver villkoret, inte den som till slut behöver ropa “stopp”.


for — för ett exakt antal iterationer

for är byggd för situationer när du vet exakt hur många varv du vill köra. Den packar tre saker på en rad: startvärde, villkor och steg.

for (int i = 1; i <= 10; i++)
{
Console.WriteLine("3 × " + i + " = " + (3 * i));
}

De tre delarna i parentes:

DelKodVad den gör
Initieringint i = 1Skapar och sätter räknarvariabeln
Villkori <= 10Kontrolleras innan varje varv
Stegi++Körs efter varje varv

i++ är kortform för i = i + 1. Du kan lika gärna skriva i += 2 om du vill hoppa varannan, eller i-- om du räknar nedåt.

Djupare: variabeln i utanför loopen

Variabeln i skapas inuti for-satsen och finns bara där. Den försvinner när loopen är klar. Om du behöver värdet utanför loopen — till exempel för att veta var loopen stannade — måste du deklarera variabeln före for:

int i;
for (i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
Console.WriteLine("Loopen stannade vid: " + i);

Det är ovanligt att behöva göra så, men bra att veta.


foreach — enklaste sättet att loopa genom en samling

När du har en samling — till exempel en array — och vill besöka varje element är foreach det renaste valet. Du slipper hålla koll på index och risken för att råka gå utanför samlingens gränser.

string[] weekdays = { "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag" };
foreach (string day in weekdays)
{
Console.WriteLine("Dag: " + day);
}

Läs det som: “för varje day i weekdays, gör det här”. Variabeln day får automatiskt värdet av nästa element i samlingen för varje varv.

foreach går alltid framåt och kan inte hoppa över eller ändra element. Det är just det som gör den säker och enkel att läsa.


Jämförelsetabell — vilken loop ska du välja?

SituationLoop
Du vet hur många varv i förvägfor
Du loopar genom en samlingforeach
Du loopar tills ett villkor uppfyllswhile
Du vill köra blocket minst en gångdo-while

Om du är osäker: börja med foreach om du har en samling, annars for. while är bäst när antalet varv styrs av något som ändras under körning — till exempel användarinput eller en nätverksfråga.


do-while — kör alltid minst en gång

do-while liknar while, men med en avgörande skillnad: villkoret kontrolleras efter blocket, inte innan. Det innebär att koden inuti alltid körs minst en gång — oavsett om villkoret är sant eller falskt från start.

string answer;
do
{
Console.Write("Skriv 'ja' för att fortsätta: ");
answer = Console.ReadLine();
}
while (answer != "ja");
Console.WriteLine("Bra! Du fortsätter.");

Skillnaden mot while är ordningen:

LoopOrdning
whileKontrollera villkor → kör blocket → upprepa
do-whileKör blocket → kontrollera villkor → upprepa

Det gör do-while till ett naturligt val för menyval och inmatningsvalidering — du vill alltid visa frågan minst en gång innan du vet vad användaren svarat.

int choice;
do
{
Console.WriteLine("1 - Starta spelet");
Console.WriteLine("2 - Avsluta");
Console.Write("Ditt val: ");
choice = int.Parse(Console.ReadLine());
}
while (choice != 1 && choice != 2);
Console.WriteLine("Du valde: " + choice);

Se även: Foreach för en djupare genomgång — listor, arrayer, dictionaries och List<T>.ForEach.