Melakukan operasi pada daftar
Saat menyimpan banyak item dalam daftar, Anda sering melakukan operasi pada bagian atau semua daftar. Modul daftar berisi banyak operasi berguna yang memungkinkan Anda melakukan hal itu.
Mencantumkan fungsi modul
Selain properti, ada modul daftar, yang penuh dengan fungsi yang beroperasi pada daftar. Fungsi ini dapat melakukan operasi yang umum digunakan, seperti menemukan, memfilter, mengurutkan, melakukan operasi matematika, dan banyak lagi.
Perulangan
Untuk melakukan pengulangan berarti melalui setiap elemen dalam daftar, dari titik awal hingga titik akhir. Untuk pengulangan, ada dua fungsi yang sangat menarik:
iter()
: Fungsi ini memungkinkan Anda melakukan pengulangan di atas setiap item dalam daftar, seperti yang ditunjukkan di sini:let cards = [ 1 .. 5 ] List.iter(fun i -> printfn "%i" i) cards // 1 2 3 4 5
Fungsi ini
iter()
mengambil fungsi. Dalam kode sebelumnya, Anda menyediakan fungsi anonim dengan menggunakan kata kuncifun
. Fungsi ini mengambil parameter yang mewakili item saat ini saat sedang diulang. Kode berikut setara dengan menulis kode berikut dengan perulangan:for i in cards do printfn "%i" i
map()
: Fungsi ini mirip denganiter()
, tetapi memungkinkan Anda mengubah apa yang Anda miliki. Berikut contohnya:type Person = { FirstName: string; LastName: string } let people = [ { FirstName="Albert"; LastName= "Einstein" } { FirstName="Marie"; LastName="Curie" } ] let nobelPrizeWinners = List.map (fun person -> person.FirstName + person.LastName) people printfn "%A" nobelPrizeWinners // ["Albert Einstein"; "Marie Curie"]
Dalam kode sebelumnya, daftar objek
Person
diubah menjadi daftar string.
Filter
Fungsi filter()
juga menggunakan fungsi sebagai parameter, tetapi tujuannya adalah untuk menentukan elemen apa yang harus disimpan. Jika ekspresi mengevaluasi ke true
, elemen tersebut disimpan. Jika ekspresinya adalah false
, elemen tersebut tidak akan menjadi bagian dari daftar yang difilter. Dalam contoh berikut, daftar difilter untuk menyimpan hanya item yang nilainya dapat dibagi dua:
let cards = [ 1 .. 5 ]
let filteredList = List.filter(fun i-> i % 2 = 0) cards
List.iter(fun i -> printfn "item %i" i) filteredList // item 2 item 4
Daftar filteredList
sekarang hanya berisi elemen yang mengembalikan true
saat dievaluasi oleh i % 2 = 0
, yaitu 2 dan 4.
Sort
Mengurutkan daftar adalah sesuatu yang mungkin sering Anda lakukan. Berikut adalah tiga fungsi yang mungkin berguna saat Mengurutkan daftar:
sort()
, urutkan dalam urutan naik. Berikut contohnya:let list = [2; 1; 5; 3] let sortedList = List.sort list // 1 2 3 5
sortBy()
: Dengan fungsi ini, idenya adalah untuk menunjukkan kunci untuk diurutkan. Katakanlah Anda memiliki daftar orang, dan setiap rekaman memiliki bidangname
danage
. Anda kemudian dapat menunjukkan untuk mengurutkan berdasarkanage
, misalnya. Fungsi ini mengambil fungsi di mana Anda menunjukkan kunci. Kunci lain bisa berupa panjang string, seperti dalam contoh ini:let fruits = ["Banana"; "Apple"; "Pineapple"] let sortedFruits = List.sortBy (fun (fruit : string) -> fruit.Length) fruits // Apple, Banana, Pineapple
sortWith()
: Dengan fungsi ini, Anda dapat menyediakan fungsi komparator, karena mungkin tidak terlihat pada awalnya mana dari beberapa item yang harus diurutkan sebelum item lain. Berikut adalah beberapa contoh kode:// assume a type like so type MagicCreature = { Name : string; Level: int; Attack: int } let creatures = [ { Name="Dragon"; Level=2; Attack=20 } { Name="Orc"; Level=1; Attack=5 } { Name="Demon"; Level=2; Attack=10 } ] // comparison function, -1 = less than, 1 = larger than, 0 = equal let compareCreatures c1 c2 = if c1.Level < c2.Level then -1 else if c1.Level > c2.Level then 1 else if c1.Attack < c2.Attack then -1 else if c1.Attack > c2.Attack then 1 else 0 let sorted = List.sortWith compareCreatures creatures // { Name="Orc"; Level=1; Attack=5 }, { Name="Demon"; Level=2; Attack=10 }, { Name="Dragon"; Level=2; Attack=20 }
Fungsi perbandingan sebelumnya
compareCreatures()
pertama-tama mencoba membandingkan denganLevel
. Jika tingkatnya sama, tingkat mencoba membandingkan dengan menggunakanAttack
. Ini mengembalikan-1
jika sesuatu dianggap lebih kecil,1
jika lebih besar, dan0
jika sama.
Pencarian
Hal lain yang mungkin ingin Anda lakukan adalah menemukan elemen tertentu. Untuk melakukannya, Anda dapat memilih dari fungsi berikut:
find()
: Fungsi ini menemukan elemen pertama yang cocok dengan kondisi tertentu. Untuk menggunakanfind()
, Anda perlu menyediakan fungsi (predikat) yang mengekspresikan cara menemukan item. Berikut contohnya:let list = [1; 2; 3; 4] let found = List.find( fun x -> x % 2 = 0) list // 2 - Only the first element that matches the condition is returned.
tryFind()
. Fungsi ini mengambil fungsi (predikat) yang memberi tahu cara menemukan nilai dan daftar untuk dilihat. Ini mengembalikan opsi. Inilah cara Anda dapat menggunakannya:let findValue aValue aList = let found = aList |> List.tryFind(fun item -> item = aValue) match found with | Some value -> printfn "%i" value | None -> printfn "Not found" findValue 1 list // 1 findValue 5 list // Not found
Dalam kode sebelumnya, Anda mengirim nilai untuk dibandingkan dengan daftar Anda. Jika ditemukan, ia akan mengembalikan
Some
. Jika tidak ditemukan, ia akan mengembalikanNone
.tryFindIndex()
. SepertitryFind()
, fungsi ini mengembalikan opsi, dan dibutuhkan fungsi (predikat) yang mengevaluasi ke Boolean. Berikut tampilan kodenya:let found = List.tryFindIndex(fun x -> x = 4) list match found with | Some index -> printfn "%i" index | None -> printfn "Not found"
Operasi aritmatika
Melakukan operasi matematika dalam daftar bisa sangat berharga. Di antara banyak fungsi yang dapat dipilih di List API, berikut adalah tiga fungsi yang paling berguna:
sum()
: Dengan menggunakan fungsi ini, Anda melakukan pengulangan pada setiap item untuk menjumlahkan semua nilai dalam daftar. Inilah cara Anda dapat menggunakannya:let sum = List.sum [1 .. 5] // sum = 15
sumBy()
: Dengan fungsi ini, idenya adalah untuk menunjukkan cara menjumlahkan nilai. Salah satu cara untuk melakukannya adalah dengan menunjukkan bidang mana yang akan dijumlahkan, seperti dalam contoh berikut:type OrderItem = { Name: string; Cost:int } let orderItems = [ { Name="XBox"; Cost=500 } { Name="Book"; Cost=10 } { Name="Movie ticket"; Cost=7 } ] let sum = List.sumBy(fun item -> item.Cost) orderItems printfn "%i" sum // 517
Dalam kode sebelumnya, bidang
Cost
ditunjukkan, dan setiap item di bidang itu ditambahkan ke total.average()
: Fungsi ini miripsum()
dengan di dalamnya beroperasi pada daftar angka, tetapi dengan dua perbedaan:- Ini mengharapkan data menjadi angka titik mengambang, bukan bilangan bulat.
- Ini menghitung rata-rata daripada jumlah.
Berikut contohnya:
let numbers = [ 1.0; 2.5; 3.0 ] let avg = List.average numbers printfn "%f" avg // 2.166667
averageBy()
: SepertisumBy()
,averageBy()
mengambil fungsi di mana Anda menentukan nilai apa yang Anda inginkan. Berikut contohnya:type WeatherMeasurement = { Date: string; Temperature: float } let measurements = [ { Date="07/20/2021"; Temperature=21.3 } { Date="07/21/2021"; Temperature=23.2 } { Date="07/22/2021"; Temperature=20.7 } ] let avgBy = List.averageBy(fun m -> m.Temperature) measurements printfn "%f" avgBy // 21.733333