Gyűjtemények és listák
Előfordulhat, hogy olyan helyzetben találja magát, amikor egy adott adattípus közül több is van. Létrehozhat egy változót minden egyes adathoz, vagy csoportosíthatja az összeset egy gyűjteménybe. Az adatok csoportosítása olyan előnyöket biztosít, mint például a metódusok nemcsak az egyes adatokon, hanem a gyűjtemény egészén is.
Gyűjtemények
A gyűjtemény használatának első jele az, hogy több olyan adatrészlete van, amelyek látszólag azonos adattípusúak. Előfordulhat, hogy egy forgatókönyvben számos bejegyzés található, például a következő kódban:
let logEntryMonday = "first entry"
let logEntryTuesDay = "second entry"
let logEntryWednesday = "third entry"
Ebben a kódban továbbra is hozzáadhat egy hasonló bejegyzést a másik után, de egy bizonyos ponton ez a megközelítés nem tűnik praktikusnak. A különálló bejegyzések nem csak kapcsolódóak, hanem valójában azonos típusúak. Érdemes minden bejegyzéshez új változót létrehozni? Valószínűleg nem. Ehelyett érdemes lehet egy gyűjteményt használni, ahol logikai, kezelhető csoportosítást hozhat létre, akár adatok hozzáadásáról vagy eltávolításáról, akár más műveletről van szó:
logEntriesWeek = ["first entry"; "second entry"; "third entry"]
Ez a kód nem csak sokkal kevesebb gépelést igényel, hanem egyfajta sorrendet is teremt, ahol minden kapcsolódó elem csoportosítva van.
Mit tud az F# felajánlani? Első lépésként három gyűjteménytípust kínál, amelyek mindegyike egy adott helyzethez lett kialakítva.
Listák: Az F#-beli lista egy rendezett, nem módosítható elemkészlet, amely ugyanahhoz a típushoz tartozik. A megváltoztathatatlan azt jelenti, hogy egy lista jobb teljesítményt nyújt, mint egy tömb, de lehet, hogy kreatívabbnak kell lennie, ha módosítani szeretné a tartalmát. Előfordulhat például, hogy új listát szeretne létrehozni egy meglévő listából. Ez a lecke a listák használatára összpontosít.
Tömbök: A tömbök rögzített méretű, azonos típusú adatelemek mutable gyűjteményei, amelyek egymás után, nulla alapú indexkel vannak rendezve. A mutable azt jelenti, hogy könnyen felvehet és eltávolíthat adatelemeket, de teljesítménybeli találatok is lehetnek.
Sorozatok: A szekvenciák azonos típusú elemek logikai sorozatai. A sorozatok időről időre érzik, mert jól működnek nagy adatgyűjteményekkel, ahol nem számít arra, hogy minden elemet használni fog. Az elemeket is csak akkor számítja ki, ha erre szükség van. Ezért a sorozatok jobb teljesítményt nyújtanak, mint bizonyos helyzetekben a listák.
Listák
Ahogy már említettük, a lista egy rendezett, nem módosítható elemkészlet. Lista létrehozásának néhány módja:
let cards = ["Ace"; "King"; "Queen"]
Ebben a kódban az elemeket zárójelek közé ([]) kell foglalnia a lista definiálásához. A listaelemek pontosvesszővel (;pontosvesszővel) vannak elválasztva.
A lista létrehozásának másik módja, ha minden elemet egy új sorba helyez, ahogy az itt látható. Ez a módszer azt is megszünteti, hogy pontosvesszőket kell használni.
let cards = [
"Ace"
"King"
"Queen"
]
A listákban az elemeknek azonos típusúaknak kell lenniük, ezért a következő deklaráció nem engedélyezett:
let cards = [ 1; "Ace"; "King" ] // not permitted
Ebben a kódban, mivel a deklaráció számok és sztringek kombinációját tartalmazza, nem engedélyezett. Egy lista létrehozásának másik módja egy tartomány operátor (..). A cél a kezdő- és a végelemek megadása egy tartomány operátorral (..) elválasztva. Ezzel létrehozza az összes számot az elejétől a végéig, beleértve a közötte lévő elemeket is. A számokat 1 2 3 4 5 például a következő kóddal hozhatja létre:
let numbers = [ 1 .. 5 ]
Lista módosítása
Ahogy már említettük, a listák nem módosíthatók, ami azt jelenti, hogy nem módosíthatók. Ha azonban másképp gondolkodik, úgy tűnhet, mintha egy elemet vagy akár egy listaelemeket ad hozzá egy listához. Ez mit jelent? Vegyük a következő példát:
let cards = ["Ace"; "King"; "Queen"]
Az előző kód egy három sztringből álló lista. Dupla kettőspont (::) operátorral hozzáfűzhet egy elemet a lista elejéhez. Az eredmény egy új lista, és a régi lista nincs hatással:
let cards = ["Ace"; "King"; "Queen"]
let newList = "Jack" :: cards // "Jack", "Ace", "King", "Queen"
A teljes listát az at sign (@) operátorral is felveheti, ahogy az itt látható:
let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["Jack"; "10"]
let fullList = cards @ otherCardList // "Ace", "King", "Queen", "Jack", "10"
A listamodulban van egy append() függvény, amely tömb- és sorozatgyűjteményekhez is használható.
append() Célszerűbb használni, ha például át kell állítania a gyűjtemény típusát a listáról a sorrendre, vagy el szeretné kerülni az elemek hozzáadásának új módját. Az at sign (@) használatával elemeket adhat hozzá egy listához, csak egy listastruktúrához használható. Tekintsük át a két példát, és használjuk append()inkább a következőt:
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"
Tulajdonságok
Az F#-listák csatolt listákként vannak implementálva. Vagyis a lista egy olyan struktúra, amelyben minden elem egy másik elemhez csatlakozik. További tanulandó kifejezések a fej, amely a lista első eleme, és a farok, amely magában foglalja a fejben nem szereplő elemeket. Például a listában 1 2 3 4a fej 1 és a farok lenne 2 3 4.
Ha így választja el az elemeket, gyorsan elérheti az első elemet, hogy elolvashassa, eltávolíthassa vagy más műveleteket hajtson végre rajta. A lista bármely elemének eléréséhez használhat egy tulajdonságot Item , amely nulla alapú indexet használ, ahogy az itt látható:
let list = [1; 2; 3; 4]
list.Item 1 // 2
A listatulajdonságokat az alábbi táblázat ismerteti:
| Tulajdonság | Leírás |
|---|---|
| Fej | A lista első eleme |
| Üres | Üres listát ad vissza; üres lista létrehozásakor használható |
| IsEmpty | Ellenőrzi, hogy az aktuális lista üres-e |
| Elem | Lekéri az aktuális elemet a megadott pozícióban (nulla alapú index) |
| Hossz | A lista elemeinek számát adja eredményül. |
| Naplótail | A lista első elemétől kezdve az összeset visszaadja |