Verzamelingen en lijsten

Voltooid

Het kan zijn dat u zich in een situatie bevindt waarin u meer dan één van een bepaald type gegevens hebt. U kunt een variabele maken voor elk stukje gegevens, of u kunt deze allemaal groeperen in een verzameling. Het groeperen van de gegevens biedt u voordelen, zoals de mogelijkheid om methoden uit te voeren, niet alleen voor afzonderlijke gegevens, maar ook voor de verzameling als geheel.

Verzamelingen

Het eerste teken dat u nodig hebt om een verzameling te gebruiken, is dat u meerdere gegevens hebt die van hetzelfde gegevenstype lijken te zijn. Mogelijk hebt u een scenario waarin u veel vermeldingen hebt, zoals in de volgende code:

let logEntryMonday = "first entry"
let logEntryTuesDay = "second entry"
let logEntryWednesday = "third entry"

In deze code kunt u doorgaan met het toevoegen van een vergelijkbare vermelding na een andere, maar op een bepaald moment begint die benadering onpraktisch te voelen. De afzonderlijke vermeldingen zijn niet alleen gerelateerd, maar zijn in feite van hetzelfde type. Is het een goed idee om voor elke vermelding een nieuwe variabele te maken? Waarschijnlijk niet. Overweeg in plaats daarvan een verzameling te gebruiken, waar u een logische, beheerbare groepering kunt maken, ongeacht of het gegevens toevoegt of verwijdert of een andere bewerking gebruikt:

logEntriesWeek = ["first entry"; "second entry"; "third entry"]

Deze code vereist niet alleen veel minder typen, maar het creëert ook een gevoel van volgorde, waarbij alles wat gerelateerd is, wordt gegroepeerd.

Wat kan F#u bieden? Om te beginnen biedt het u drie soorten verzamelingen, die elk zijn ontworpen voor een bepaalde situatie.

  • Lijsten: Een lijst in F# is een geordende, onveranderbare set elementen van hetzelfde type. Onveranderbaar betekent dat een lijst betere prestaties kan bieden dan een matrix, maar misschien moet u creatiever zijn als u de inhoud ervan wilt wijzigen. U kunt bijvoorbeeld een nieuwe lijst maken op basis van een bestaande lijst. Deze les is gericht op het gebruik van lijsten.

  • Matrices: matrices zijn verzamelingen met vaste grootte, onveranderbare verzamelingen gegevenselementen van hetzelfde type die opeenvolgend worden geordend met een op nul gebaseerde index. Veranderlijk betekent dat het eenvoudig is om gegevenselementen toe te voegen en te verwijderen, maar er kan een prestatietreffer optreden.

  • Reeksen: Een reeks is een logische reeks elementen van hetzelfde type. Een reeks heeft een Just-In-Time-gevoel, omdat het goed werkt met grote verzamelingen gegevens, waarbij u niet verwacht dat alle elementen worden gebruikt. Ook worden elementen alleen berekend wanneer dit vereist is. Daarom kunnen reeksen betere prestaties bieden dan lijsten in bepaalde situaties.

Lijsten

Zoals we al hebben gezegd, is een lijst een geordende, onveranderbare set elementen. Hier volgen enkele manieren om een lijst te maken:

let cards = ["Ace"; "King"; "Queen"]

In deze code plaatst u de elementen tussen vierkante haken ([]) om de lijst te definiëren. De lijstitems worden gescheiden door een puntkomma (;).

Een andere manier om een lijst te maken, is door elk element op een nieuwe regel te plaatsen, zoals hier wordt weergegeven. Met deze methode hoeft u ook puntkomma's te gebruiken.

let cards = [
  "Ace"
  "King"
  "Queen"
]

In lijsten moeten elementen van hetzelfde type zijn, dus de volgende declaratie is niet toegestaan:

let cards = [ 1; "Ace"; "King" ] // not permitted

Omdat de declaratie getallen en tekenreeksen combineert, is deze code niet toegestaan. Een andere manier om een lijst te maken, is door een bereikoperator (..) te gebruiken. Het idee is om de begin- en eindelementen op te geven, gescheiden door een bereikoperator (..). Als u dit doet, worden alle getallen van begin tot eind gemaakt, inclusief de tussen-elementen. U kunt bijvoorbeeld de getallen 1 2 3 4 5 maken met behulp van de volgende code:

let numbers = [ 1 .. 5 ]

Een lijst wijzigen

Zoals we al zeiden, zijn lijsten onveranderbaar, wat betekent dat ze niet kunnen worden gewijzigd. Door er anders over na te denken, kunt u het lijken alsof u een item of zelfs een lijst met items aan een lijst toevoegt. Wat betekent dat? Kijk een naar het volgende voorbeeld:

let cards = ["Ace"; "King"; "Queen"]

De voorgaande code is een lijst met drie tekenreeksen. Met behulp van een operator met dubbele dubbele punt (::) kunt u een item toevoegen aan het begin van een lijst. Het resultaat is een nieuwe lijst en de oude lijst wordt niet beïnvloed:

let cards = ["Ace"; "King"; "Queen"]
let newList = "Jack" :: cards // "Jack", "Ace", "King", "Queen" 

U kunt ook een volledige lijst toevoegen met behulp van de operator at sign (@), zoals hier wordt weergegeven:

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["Jack"; "10"]
let fullList = cards @ otherCardList // "Ace", "King", "Queen", "Jack", "10"

Er is een append() functie in de lijstmodule en deze werkt voor zowel matrix- als reeksverzamelingen. U kunt het beste het beste gebruiken append() als u bijvoorbeeld het verzamelingstype van lijst naar reeks moet overschakelen of als u wilt voorkomen dat u een nieuwe manier moet leren om items toe te voegen. Als u het at-teken (@) gebruikt om elementen toe te voegen aan een lijst, werkt alleen voor een lijststructuur. Laten we onze twee voorbeelden opnieuw bekijken en in plaats daarvan het volgende gebruiken 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"

Eigenschappen

Lijsten in F# worden geïmplementeerd als gekoppelde lijsten. Dat wil gezegd, een lijst is een structuur waarin elk element is verbonden met een ander element. Meer termen om te leren zijn kop, het eerste element in de lijst en tail, dat de elementen bevat die zich niet in het hoofd bevinden. In de lijst 1 2 3 4zou het hoofd bijvoorbeeld zijn 1 en de staart zou zijn 2 3 4.

Door de elementen op deze manier te scheiden, hebt u snel toegang tot het eerste element, zodat u er andere acties op kunt lezen, verwijderen of uitvoeren. Als u toegang wilt krijgen tot een specifiek item in de lijst, kunt u een Item eigenschap gebruiken, die een index op basis van nul gebruikt, zoals hier wordt weergegeven:

let list = [1; 2; 3; 4]
list.Item 1 // 2

De lijsteigenschappen worden beschreven in de volgende tabel:

Eigenschappen Beschrijving
Head Het eerste element in een lijst
Leeg Retourneert een lege lijst; kan worden gebruikt wanneer u een lege lijst wilt maken
IsEmpty Controleert of de huidige lijst leeg is
Artikel Haalt het huidige element op de opgegeven positie op (op nul gebaseerde index)
Lengte Geeft als resultaat het aantal items in de lijst
Staart Retourneert alle behalve het eerste element in de lijst