E' proprio vero: le interrogazioni con LINQ sono veramente fin troppo semplici ed intuitive... Oggi ad esempio mi chiedevo come fosse possibile implementare alcune features tipiche di un motore di ricerca sfruttando LINQ to Objects e, tra le varie possibilità, mi sono soffermato sulla creazione di un esempio in cui venisse mostrato come cercare le frasi, a partire da una stringa, che contengono contemporaneamente un insieme di termini di ricerca specificato.
using System.Linq;
...
string Testo = @"Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.";
string[] ParoleDaCercare = { "dolor", "tempor" };
var query = from Frase in Testo.Split(new char[] { '.', '?', ';', ':' , '!' })
let Parole = Frase.Split(new char[] { ' ', ',' })
where Parole.Distinct().Intersect(ParoleDaCercare).Count() == ParoleDaCercare.Count()
select Frase;
Come si può vedere, si procede per due livelli di splitting, il primo per recuperare le frasi dell'intero testo mentre il secondo per reperire ciascuna parola contenuta in ogni frase. In particolare, si osserva immediatamente l'uso della keywork let che permette di specificare delle query temporanee i cui risultati possono essere associati ad un identificatore (nel nostro caso Parole), inizializzabile una sola volta ed ulteriormente interrogabile.
Nel nostro esempio, su ciascun risultato temporaneo ottenuto grazie alla keyword let è stato invocato il metodo Distinct() su ciascun Array per rimuovere le parole duplicate all'interno della stessa frase. Infine, via Intersect(), è possibile stabilire se la frase correntemente analizzata contiene esattamente i termini oggetto della ricerca.
Impressionante la vicinanza della sintassi LINQ a quella che sovviene nella mente di uno sviluppatore in fase di progettazione di una interrogazione ;).
Technorati tags: LINQ, .NET