Iterating Collections
Præsenter som slidesLæringsmål
- Kan iterere over lister, arrays og dictionaries
- Kan bruge nested loops til komplekse datastrukturer
- Kan forklare forskellen på iteration over keys og values
- Kan kombinere datastrukturer og loops i en samlet løsning
Iteration over collections
At iterere betyder at gennemløbe en samling element for element. Du har lært for, while, do-while og foreach i kapitlet Loops — her fokuserer vi på at anvende dem på arrays, lister og dictionaries.
foreach er særligt velegnet til samlinger — du gennemløber alle elementer uden at håndtere indeks. Brug for med indeks, når du skal kende positionen eller ændre elementer på bestemte pladser.
Vælg loop: foreach til simple gennemløb. for når du har brug for indeks eller nested strukturer. Se også Arrays, Lists & Dictionaries.
Iteration over arrays
Et array er en samling af samme type med fast længde.
Med for — når du har brug for indeks eller .Length:
Med foreach — når du bare skal læse hvert element:
Iteration over lister
En List<T> er dynamisk — brug .Count i stedet for .Length.
Med for:
Med foreach:
Du kan ikke tilføje eller fjerne elementer i en liste under en foreach — det giver runtime-fejl. Brug for baglæns eller ToList() hvis du skal fjerne under gennemløb.
Nested loops — lister af lister (matrix)
Når hvert element også er en liste, bruger du nested loops — en løkke inde i en anden:
Med foreach:
Den ydre løkke går gennem rækkerne; den indre gennem elementerne i hver række.
Iteration i praksis — IP-omformeren
Nested loops og while med break/continue bruger du i det rigtige IP/binær-projekt — se Binary Numbers & IP Addresses.
Typisk mønster i omformeren:
while (!gyldig)— spørg igen ved ugyldigt inputfor (int i = 0; i < 4; i++)— gennemløb de 4 oktetterfor (int j = 0; j < 8; j++)— gennemløb de 8 bits per oktetbreak— stop validering ved fejl;continue— spring til næste forsøg
Det kombinerer loops, conditionals og strings (Split) i én løsning.
Iteration over Dictionary
En Dictionary<TKey, TValue> gemmer nøgle/værdi-par. foreach er den naturlige måde at gennemløbe den:
Kun nøgler:
Kun værdier:
Deconstruction (moderne, læsbar syntaks):
Supplerende: LINQ og IEnumerable
LINQ (Language Integrated Query) er en måde at filtrere, sortere og udvælge data fra collections uden at skrive alle loops selv. Du bruger det typisk ovenpå List<T>, arrays og andre typer, der kan gennemløbes som IEnumerable<T>.
Videoer
Se det i praksis
Language Integrated Query (LINQ) and IEnumerable [Pt 15] | C# for Beginners
LINQ Query Expressions From, Where, Orderby, and Select [Pt 16] | C# for Beginners
LINQ Method Syntax vs Query [Pt 17] | C# for Beginners
Filtrering og akkumulering
Iteration kombineres ofte med if og sum:
Kombineret løsning — elever og fag
Dictionary af lister — nested foreach på to niveauer:
Det er præcis den slags struktur, du møder i GF2-projekter.
Git-trin
- Branch:
main - Commit:
feat: iteration over collections
Opsummering
- Arrays og lister — både
for(med indeks) ogforeach(simpelt gennemløb) - Lister af lister — nested loops (
for/foreachindeni hinanden) - Dictionaries —
KeyValuePair,.Keys,.Valueseller deconstruction - Kombinér iteration med if (filtrering) og sum (akkumulering)
- Real-world: IP-omformeren kombinerer
while,for,breakogcontinue
Test din viden
Spørgsmål 1
Hvornår er foreach særligt velegnet?
foreach er den simpleste måde at læse hvert element i en array, liste eller dictionary — uden at skrive for (int i = 0; i < ....
Spørgsmål 2
Hvad bruger du til antal elementer i en List<T> i en for-løkke?
Lister bruger .Count. Arrays bruger .Length. I for (int i = 0; i < names.Count; i++) skal det være .Count for lister.
Spørgsmål 3
Hvad er formålet med nested loops?
Nested loops (løkke inde i løkke) bruges til 2D-data — fx matrix eller IP-omformeren: ydre løkke over 4 oktetter, indre over 8 bits.
Spørgsmål 4
Hvordan får du kun nøglerne fra en Dictionary?
.Keys giver alle nøgler, .Values alle værdier, og foreach (var (name, age) in ages) giver begge (deconstruction).
Spørgsmål 5
Hvorfor bør du undgå .Add()/.Remove() på en liste under foreach?
Modificering under foreach invalidérer enumerator'en. Brug for baglæns eller kopiér til ToList(), hvis du skal fjerne under iteration.
Spørgsmål 6
Hvad er mønsteret akkumulering i en løkke?
Fx int sum = 0; foreach (var score in scores.Values) sum += score; — derefter average = (double)sum / scores.Count. Det genbruges konstant i GF2.
Spørgsmål 7
Hvornår vælger du for med indeks frem for foreach?
for giver adgang til i og collection[i] — nødvendigt til nested strukturer, baglæns fjernelse og når indeks betyder noget (fx bit-position i binær oktet).