LINQ è la magia che .NET ha dimostrato di avere negli ultimi anni. Basato su una monade (una struttura matematica) decisamente semplice, LINQ semplifica la vita del developer e dà un tocco di classe al codice, come mai prima. I numerosi interventi nel linguaggio, con l'avvento di 3.0, hanno permesso di costruire LINQ, in 3.5, in maniera robusta, e darci oggi forse il motore di interrogazione universale che si aspettava da tempo.Abbiamo ad oggi diversi provider di LINQ, in circolazione:
Fondamenti (ovvero i tasselli fondamentali per poter usare LINQ)Nella tipica query LINQ il developer "figo" scrive:
var qualcosa= ... //query complessa
var a; a=10;
var b; b=new StreamWriter(...);
Spesso poi ci è capitato di volere un costruttore con tutti i parametri convergenti alle public properties del nostro oggetto (per poterle assegnare in costruzione); questa cosa, per l'appunto, necessita l'implementazione di uno o più costruttori atti allo scopo. Invece nuova è la possibilità di istanziare un oggetto e assegnarne già le proprietà, in questo modo:
var pers = new Persona() { Cognome = "Freato", Nome = "Roberto", DataNascita = DateTime.Parse("12/14/1984"), Telefono = "+39123456789", Indirizzo = new IndirizzoStruct() { CAP="20100", Citta="Milano", Civico="1", Nome="Duomo", Tipo=TipoVia.Piazza } };
var variabileDiUnMioTipoInventatoOra = new { CoordX = 10, CoordY = 20, CoordZ = 30 };
LAMBDA ExpressionsLe espressioni LAMBDA rappresentano il sogno di molti, che possono vedere finalmente l'eleganza matematica, dentro C#. Una espressione lambda è una funzione che non viene scritta nel corpo di una classe, bensì all'interno di una funzione: esattamente come dichiarare una variabile.
delegate int TipoFunc(int a); public void Operazioni() { //operazioni TipoFunc potenza = (a) => { return a * a; }; int res = potenza(10); }
TipoFunc potenza = a => a * a;
Dei metodi di estensione abbiamogià parlato, quindi ora passiamo a LINQ, iniziando da un esempio:
DirectoryInfo info=new DirectoryInfo(@"x:\"); var hugeDirs=info.GetDirectories() .Where(p=>p.GetFiles().Count()>100) .Select(p=> new {Dir=p.Name,Files=p.GetFiles()});
LINQ supporta la valutazione lazy, per cui i dati possono essere prelevati SOLO nel momento in cui vengono effettivamente richiesti da una valutazione.Questo, vedremo poi, ci permette di costruire anche collezioni immaginarie di tutti i numeri naturali (o reali, o primi, o come-vogliamo), per esempio, senza portare in blocco la cpu.Da qui si apre un mondo che, se il tempo mi permetterà, approfondirò nella sezione apposta dedicata a LINQ.