En aquest tema, explorarem com utilitzar LINQ (Language Integrated Query) en F#. LINQ és una poderosa característica de .NET que permet realitzar consultes sobre col·leccions de dades de manera declarativa. Tot i que LINQ és més conegut en el context de C#, també es pot utilitzar en F# amb algunes diferències sintàctiques.
Objectius d'Aprenentatge
- Comprendre què és LINQ i com s'utilitza en F#.
- Aprendre a realitzar operacions bàsiques de consulta amb LINQ.
- Veure exemples pràctics d'ús de LINQ en F#.
- Realitzar exercicis pràctics per reforçar els conceptes apresos.
Introducció a LINQ
LINQ permet realitzar operacions de consulta sobre col·leccions de dades com si estiguéssim utilitzant SQL. Les operacions de LINQ es poden aplicar a arrays, llistes, seqüències i altres col·leccions.
Exemple Bàsic de LINQ en F#
open System.Linq let numbers = [| 1; 2; 3; 4; 5; 6; 7; 8; 9; 10 |] let evenNumbers = numbers |> Seq.filter (fun n -> n % 2 = 0) |> Seq.toArray printfn "Even numbers: %A" evenNumbers
Explicació del Codi
- Importació del Mòdul LINQ:
open System.Linq
importa les funcions de LINQ. - Definició de la Col·lecció:
numbers
és un array d'enters. - Filtratge amb LINQ:
Seq.filter
s'utilitza per seleccionar només els números parells. - Conversió a Array:
Seq.toArray
converteix la seqüència resultant en un array. - Impressió del Resultat:
printfn
s'utilitza per imprimir els números parells.
Operacions Bàsiques amb LINQ
Selecció (Select)
Filtratge (Where)
let greaterThanFive = numbers |> Seq.filter (fun n -> n > 5) |> Seq.toArray printfn "Numbers greater than five: %A" greaterThanFive
Ordenació (OrderBy)
Agrupació (GroupBy)
let groupedByEvenOdd = numbers |> Seq.groupBy (fun n -> n % 2 = 0) |> Seq.map (fun (key, group) -> (key, Seq.toArray group)) |> Seq.toArray printfn "Grouped by even/odd: %A" groupedByEvenOdd
Exercicis Pràctics
Exercici 1: Filtrar i Ordenar
Descripció: Escriu una funció que filtri els números imparells d'una llista i els ordeni en ordre descendent.
Codi Inicial:
let filterAndSortDescending numbers = // Implementa la funció aquí [] let result = filterAndSortDescending [1; 3; 5; 2; 4; 6; 7; 8; 9; 10] printfn "Result: %A" result
Solució:
let filterAndSortDescending numbers = numbers |> Seq.filter (fun n -> n % 2 <> 0) |> Seq.sortDescending |> Seq.toList let result = filterAndSortDescending [1; 3; 5; 2; 4; 6; 7; 8; 9; 10] printfn "Result: %A" result
Exercici 2: Agrupar per Longitud de Paraula
Descripció: Escriu una funció que agrupi una llista de paraules per la seva longitud.
Codi Inicial:
let groupByLength words = // Implementa la funció aquí [] let result = groupByLength ["apple"; "banana"; "cherry"; "date"; "fig"; "grape"] printfn "Result: %A" result
Solució:
let groupByLength words = words |> Seq.groupBy (fun word -> word.Length) |> Seq.map (fun (key, group) -> (key, Seq.toList group)) |> Seq.toList let result = groupByLength ["apple"; "banana"; "cherry"; "date"; "fig"; "grape"] printfn "Result: %A" result
Resum
En aquest tema, hem après com utilitzar LINQ en F# per realitzar operacions de consulta sobre col·leccions de dades. Hem vist exemples pràctics de selecció, filtratge, ordenació i agrupació. També hem realitzat exercicis pràctics per reforçar els conceptes apresos. LINQ és una eina poderosa que pot simplificar molt el treball amb col·leccions de dades en F#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment