Samlinger og lister
Du befinder dig måske i en situation, hvor du har mere end én af en bestemt type data. Du kan oprette en variabel for hver enkelt datadel, eller du kan gruppere det hele i en samling. Hvis du grupperer dataene, får du fordele, f.eks. muligheden for at udføre metoder, ikke kun på individuelle datastykker, men i samlingen som helhed.
Samlinger
Det første tegn på, at du skal bruge en samling, er, at du har flere datadele, der ser ud til at være af samme datatype. Du kan have et scenarie, hvor du har mange poster, f.eks. i følgende kode:
let logEntryMonday = "first entry"
let logEntryTuesDay = "second entry"
let logEntryWednesday = "third entry"
I denne kode kan du fortsætte med at tilføje én lignende post efter den anden, men på et tidspunkt begynder denne fremgangsmåde at føles upraktisk. De separate poster er ikke kun relaterede, men er faktisk af samme type. Er det en god idé at oprette en ny variabel for hver post? Sandsynligvis ikke. Overvej i stedet at bruge en samling, hvor du kan oprette en logisk, håndterbar gruppering, uanset om det er at tilføje eller fjerne data eller bruge en anden handling:
logEntriesWeek = ["first entry"; "second entry"; "third entry"]
Denne kode kræver ikke kun meget mindre indtastning, men den skaber også en ordensfølelse, hvor alt, hvad der er relateret til, er grupperet.
Så hvad kan F# tilbyde dig? Til at starte med giver det dig tre typer samlinger, der hver især er designet til en bestemt situation.
Lister: En liste i F# er en sorteret uforanderlige sæt elementer af samme type. Uforanderlige betyder, at en liste kan give bedre ydeevne end en matrix, men du skal muligvis være mere kreativ, hvis du vil ændre dens indhold. Det kan f.eks. være en god idé at oprette en ny liste ud fra en eksisterende liste. I dette undermodul fokuseres der på brug af lister.
Matrixer: Matrixer er af fast størrelse, justerbare samlinger af dataelementer af samme type, der sorteres efter hinanden med et nulbaseret indeks. Slå lyden fra betyder, at det er nemt at tilføje og fjerne dataelementer, men der kan være et ydeevneresultat.
Sekvenser: En sekvens er en logisk serie af elementer af samme type. En sekvens har en just-in-time-følelse, fordi den fungerer godt sammen med store samlinger af data, hvor du ikke forventer at bruge alle elementer. Den beregner også kun elementer, når det er påkrævet for at gøre det. Derfor kan sekvenser give bedre ydeevne end lister i visse situationer.
Lister
Som vi har nævnt, er en liste et ordnet, uforanderligt sæt elementer. Her er nogle måder at oprette en liste på:
let cards = ["Ace"; "King"; "Queen"]
I denne kode skal du omslutte elementerne i kantede parenteser ([]) for at definere listen. Listeelementerne er adskilt af et semikolon (;).
En anden måde at oprette en liste på er ved at placere hvert element på en ny linje, som vist her. Denne metode fjerner også behovet for at bruge semikolon.
let cards = [
"Ace"
"King"
"Queen"
]
På lister skal elementer være af samme type, så følgende erklæring er ikke tilladt:
let cards = [ 1; "Ace"; "King" ] // not permitted
Da erklæringen blander tal og strenge i denne kode, er det ikke tilladt. En anden måde at oprette en liste på er ved at bruge en områdeoperator (..). Ideen er at angive start- og slutelementerne adskilt af en områdeoperator (..). Hvis du gør det, oprettes alle tallene fra start til slut, herunder in-between-elementer. Du kan f.eks. oprette tallene 1 2 3 4 5 ved hjælp af følgende kode:
let numbers = [ 1 .. 5 ]
Rediger en liste
Som vi nævnte, er lister uforanderlige, hvilket betyder, at de ikke kan ændres. Ved at tænke anderledes på det kan du dog få det til at se ud, som om du føjer et element eller endda en liste over elementer til en liste. Hvad betyder det? Se følgende eksempel:
let cards = ["Ace"; "King"; "Queen"]
Den foregående kode er en liste, der består af tre strenge. Ved hjælp af en dobbeltkolonoperator (::) kan du føje et element til starten af en liste. Resultatet er en ny liste, og den gamle liste påvirkes ikke:
let cards = ["Ace"; "King"; "Queen"]
let newList = "Jack" :: cards // "Jack", "Ace", "King", "Queen"
Du kan også tilføje en hel liste ved hjælp af operatoren at sign (@) som vist her:
let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["Jack"; "10"]
let fullList = cards @ otherCardList // "Ace", "King", "Queen", "Jack", "10"
Der er en append() funktion i listemodulet, og den fungerer for både matrix- og sekvenssamlinger. Det er at foretrække at bruge append() hvis du f.eks. har brug for at skifte samlingstype fra liste til sekvens, eller hvis du vil undgå at skulle lære en ny måde at tilføje elementer på. Brug af at-tegnet (@) til at føje elementer til en liste fungerer kun for en listestruktur. Lad os vende tilbage til vores to eksempler og i stedet bruge append():
let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["10"; "9"]
let fullList = cards |> List.append ["Jack"] // "Jack", "Ace", "King", "Queen"
let fullList = cards |> List.append otherCardList // "10", "9", "Ace", "King", "Queen"
Egenskaber
Lister i F# implementeres som sammenkædede lister. Dvs. en liste er en struktur, hvor hvert element er forbundet til et andet element. Du kan få mere at vide hoved, som er det første element på listen, og hale, som omfatter de elementer, der ikke findes i hovedet. På listen 1 2 3 4ville hovedet f.eks. være 1, og halen ville være 2 3 4.
Ved at adskille elementerne på denne måde kan du hurtigt få adgang til det første element, så du kan læse, fjerne eller udføre andre handlinger på det. Hvis du vil have adgang til et bestemt element på listen, kan du bruge en Item egenskab, som kræver et nulbaseret indeks, som vist her:
let list = [1; 2; 3; 4]
list.Item 1 // 2
Listeegenskaberne er beskrevet i følgende tabel:
| Egenskab | Beskrivelse |
|---|---|
| Hoved | Det første element på en liste |
| Tom | Returnerer en tom liste. kan bruges, når du vil oprette en tom liste |
| IsEmpty | Kontrollerer, om den aktuelle liste er tom |
| Vare | Henter det aktuelle element på den angivne placering (nulbaseret indeks) |
| Længde | Returnerer antallet af elementer på listen |
| Hale | Returnerer alle undtagen det første element på listen |