Namngivna loopar
När du har nästlade loopar kan break och continue bara styra den innersta loopen. Med namngivna loopar kan du peka ut exakt vilken loop du vill bryta ur eller hoppa vidare i.
När du läst detta ska du kunna
- Namnge en loop med en etikett
- Använda
break etikettför att hoppa ur en yttre loop - Använda
continue etikettför att hoppa till nästa varv i en yttre loop - Förklara när detta är bättre än en bool-flagga
Syntax
Sätt etiketten direkt före loop-nyckelordet, följt av kolon:
outerLoop: foreach (var row in matrix){ foreach (var item in row) { if (item == target) break outerLoop; }}Problemet namngivna loopar löser
Utan namngivna loopar behöver du en flagga för att signalera att den yttre loopen ska avslutas:
// Utan namngivna loopar — krånglig bool-flaggabool found = false;
foreach (var row in matrix){ foreach (var item in row) { if (item == target) { found = true; break; } }
if (found) break;}// Med namngivna loopar — direkt och tydligtouterLoop: foreach (var row in matrix){ foreach (var item in row) { if (item == target) break outerLoop; }}break — hoppa ur en yttre loop
int[][] matrix ={ [1, 2, 3], [4, 5, 6], [7, 8, 9]};
int target = 5;bool found = false;
searchLoop: for (int row = 0; row < matrix.Length; row++){ for (int col = 0; col < matrix[row].Length; col++) { if (matrix[row][col] == target) { Console.WriteLine($"Hittade {target} på rad {row}, kolumn {col}"); found = true; break searchLoop; } }}
Console.WriteLine(found ? "Klar." : "Hittades inte.");Output
Hittade 5 på rad 1, kolumn 1Klar.continue — hoppa till nästa varv i yttre loop
continue med en etikett hoppar vidare till nästa iteration av den namngivna loopen — och hoppar alltså ur den inre loopen helt:
var departments = new List<string[]>{ ["Anna", "SKIP", "Björn"], ["Clara", "David"], ["SKIP", "Emma"]};
nextDept: foreach (var dept in departments){ foreach (var name in dept) { if (name == "SKIP") continue nextDept; // Hoppar till nästa department
Console.WriteLine(name); }}Output
AnnaClaraDavidVarje department som innehåller "SKIP" avslutas direkt och nästa startar.
Etikettnamn
Etiketter kan heta vad som helst — välj något som beskriver vad loopen gör:
rowSearch: for (int i = 0; i < rows; i++)pageLoop: foreach (var page in pages)retryLoop: while (attempts < maxAttempts)TL;DR
| Sats | Vad den gör |
|---|---|
break label | Hoppar ur den namngivna loopen direkt |
continue label | Hoppar till nästa varv i den namngivna loopen |
Använd namngivna loopar när du annars skulle behöva en bool-flagga för att kommunicera ut ur en inre loop.