Arrays, Lists & Dictionaries
Præsenter som slidesLæringsmål
- Kan forklare forskellen på arrays, lister og dictionaries
- Kan oprette, tilgå og ændre elementer i array og liste
- Kan forklare, hvornår en liste er bedre end et array
- Kan bruge en dictionary til key-value opslag
- Kan vælge den rigtige datastruktur ud fra problemstillingen
Arrays, lister og dictionaries
Rækketyper som arrays, lister og dictionaries samler flere værdier under ét navn — så du kan pege på en hel samling med én variabel i stedet for ti enkeltvariabler.
Fra simple typer til samlinger
En int er 32 bit (4 bytes) og gemmer én værdi. double, float og decimal fylder mere grundet deres præcision. char er 16 bit i C# (Unicode), selvom mange tegn kun bruger 8 bit.
Disse kaldes simple datatyper eller primitive typer — de kan vises som enkelt værdier:
int age = 17; // én værdi
char letter = 'A'; // ét tegn
Hvad gør vi, når vi vil gemme mange værdier — fx en række tal eller tegn? Her kommer arrays og lister ind. I har faktisk allerede brugt dem: en string er en sekvens af tegn — i C# et objekt, men idéen er den samme som en række char-værdier bundet sammen.
Arrays
Et array gemmer en samling af elementer af samme type med fast størrelse.
Arrays er indekserede — hvert element har en plads (indeks), og du tilgår dem med [indeks]:
int[] numbers = { 1, 2, 3, 4, 5 }
[0] [1] [2] [3] [4]
1 → 2 → 3 → 4 → 5
Opret et array med fast størrelse:
int[] numbers = new int[10]; // 10 heltal, initialiseret til 0
Initialiser med værdier:
int[] numbers = { 10, 20, 30 };
Tilgå og ændre elementer — indeks starter altid ved 0:
Gå aldrig uden for arrayets grænser — numbers[10] på et array med længde 10 giver fejl. Gyldige indeks er 0 til Length - 1.
Arrays er effektive når størrelsen er kendt og uforanderlig — fx ugedage (7), oktetter i en IP (4), eller en fast liste scores.
Lister
En List<T> kan vokse og krympe dynamisk — den mest brugte samling i daglig C#.
using System.Collections.Generic;
List<int> numbers = new List<int>();
Tilføj elementer:
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);
Tilgå og ændre via indeks — samme syntaks som arrays:
Flere metoder:
var names = new List<string> { "Ada", "Alan" };
names.Add("Grace"); // tilføj til slutningen
names.Insert(0, "Grace H."); // indsæt på indeks
names.Remove("Alan"); // fjern efter værdi
names.Clear(); // fjern alle
Lister er reference-typer — variablen peger på listen i hukommelsen, ikke en kopi. Vær opmærksom, når du deler lister mellem metoder.
Arrays vs. lister — hvornår bruger man hvad?
| Emne | Array | List<T> |
|---|---|---|
| Hukommelse | Mindre — ingen ekstra metoder | Lidt mere — baggrund og metoder |
| Størrelse | Fast ved oprettelse | Dynamisk — Add/Remove |
| Adgang | Hurtig, kontinuerlig blok | Fleksibel tilføjelse/fjernelse |
| Tilføj element | ❌ fast størrelse | ✅ .Add() |
| Fjern element | ❌ | ✅ .Remove() |
| Tilgå element | numbers[0] |
names[0] |
| Antal elementer | .Length |
.Count |
| Loop | for / foreach |
for / foreach |
Generelt: Kender du størrelsen på forhånd og skal den ikke ændres → array. Skal samlingen vokse eller krympe → liste.
Huskeregel:
- Array → du ved præcis hvor mange. Fx dage i ugen (7).
- Liste → du ved ikke hvor mange. Fx en indkøbsliste.
- Dictionary → du vil slå noget op på et navn. Fx en telefonbog.
I praksis vælger mange udviklere liste som standard — den er mere fleksibel.
Videoer
Se det i praksis
List<T> and Collections of Data [Pt 12] | C# for Beginners
Arrays, Lists, Indexing, and Foreach [Pt 13] | C# for Beginners
Sorting and Searching Lists [Pt 14] | C# for Beginners
Dictionary — nøgle og værdi
En Dictionary<TKey, TValue> gemmer nøgle/værdi-par. Den er bygget som et hash map, så opslag på nøgle er meget effektivt — typisk O(1) (konstant tid).
Dictionary<string, int> ageMap = new Dictionary<string, int>();
ageMap.Add("Anders", 25);
ageMap.Add("Line", 30);
int lineAge = ageMap["Line"]; // 30 — opslag via nøgle
Tilføj eller opdater med indexer-syntaks:
ageMap["Grace"] = 22; // tilføj ny
ageMap["Anders"] = 26; // opdater eksisterende
Sikkert opslag med TryGetValue — undgår fejl hvis nøglen ikke findes:
Hash-funktionen fordeler nøgler i buckets — derfor er opslag hurtigt uden at gennemsøge hele listen.
Sammenligning — array, liste og dictionary
| Metode | Array | List<T> | Dictionary<K,V> |
|---|---|---|---|
| Tilføj element | ❌ fast størrelse | ✅ .Add() |
✅ .Add(key, val) |
| Fjern element | ❌ | ✅ .Remove() |
✅ .Remove(key) |
| Tilgå element | numbers[0] |
names[0] |
map["Anders"] |
| Loop | for / foreach |
for / foreach |
foreach KeyValuePair |
| Antal | .Length |
.Count |
.Count |
Vælg datastruktur:
- Skal du gemme flere værdier af samme type?
- Kender du størrelsen? → Ja → array. Nej → videre.
- Har du brug for nøgler? → Nej → liste. Ja → dictionary.
Iteration over samlinger
Alle tre kan gennemløbes med loops — se også kapitlet Loops:
Praktisk eksempel — elever og karakterer
Mønsteret liste over nøgler + dictionary med data genbruges i mange GF2-opgaver og projekter.
Git-trin
- Branch:
main - Commit:
feat: arrays lister dictionary
Opsummering
- Arrays — fast størrelse, effektiv indeksering, god til kendte mængder
- Lister — dynamisk størrelse, Add/Remove, standardvalg i moderne C#
- Dictionaries — nøgle/værdi-opslag, hurtig hash-baseret adgang
- Vælg struktur efter problem: fast størrelse, dynamisk samling eller opslag på navn
Test din viden
Spørgsmål 1
Hvad er hovedforskellen på et array og en List<T>?
Arrays allokeres med fast længde ved oprettelse. Lister understøtter .Add() og .Remove() — vælg liste, når du ikke kender antallet på forhånd.
Spørgsmål 2
Hvilket indeks har første element i et array?
C# (som de fleste sprog) bruger 0-baseret indeksering. Første element er array[0], sidste er array[Length - 1].
Spørgsmål 3
Hvornår er en Dictionary det rigtige valg?
En Dictionary gemmer nøgle/værdi-par — som en telefonbog. Opslag via nøgle er typisk O(1) takket være hash-fordeling.
Spørgsmål 4
Hvad returnerer ageMap.TryGetValue("Ada", out int age) hvis nøglen ikke findes?
TryGetValue er sikkert opslag — den returnerer false uden at crashe, hvis nøglen mangler. Direkte map["Ada"] kaster fejl, når nøglen ikke findes.
Spørgsmål 5
Hvad er gyldige indeks for et array med Length = 10?
Med længde 10 er gyldige indeks 0 til 9. array[10] giver IndexOutOfRangeException — det er en almindelig begynderfejl.
Spørgsmål 6
Hvilken property bruger du til antal elementer i en List<string>?
Lister bruger .Count. Arrays bruger .Length. Bland dem ikke — compileren giver fejl, hvis du bruger den forkerte.
Spørgsmål 7
Ifølge huskereglen i kapitlet — hvornår vælger du et array?
Array → kendt, fast antal. Liste → ukendt eller varierende antal. Dictionary → opslag på nøgle/navn.