Visualizzazione post con etichetta linq. Mostra tutti i post
Visualizzazione post con etichetta linq. Mostra tutti i post

lunedì, luglio 30, 2007

LINQ e Filesystem

La potenza di linq è veramente incredibile,
linq è utilizzabile già su molti tipi come ad esempio i vettori di stringhe,
come ho dimostrato nel post precedente, si può utilizzare questa caratteristica,
assieme ad un altra nuova features di VS 2008 ovvero gli extension method per interrogare in maniera intelligente il filesystem

ad esempio, supponiamo di voler selezionare alcuni files in base ad un espressione regolare, sappiamo che Directory.getFiles ritorna un Array di String..

sarebbe bello poter aggiungere un metodo generico per validare una stringa rispetto a una regular expression..
scopriamo che grazie all' aggiunta del extension method è possibile.
Tutto ciò che dobbiamo fare è creare una classe statica e aggiungere i nostri metodi statici in questo modo:


public static class extension {
public static bool Match(this string me, string regExp){
System.Text.RegularExpressions.Regex rg=
new System.Text.RegularExpressions.Regex(regExp);

return rg.IsMatch(me);
}
}


il this prima del string me aggiunge questa funzione a tutte le stringhe
sarà quindi possibile ora fare "".Match("") !!!
Supponiamo di avere la seguente cartella C:\TEST:



proviamo ora a leggere dalla directory c:\TEST tutti i files che terminano con txt
e facciamoci tornare un po di proprietà del file

var selection =

from file in System.IO.Directory.GetFiles("C:\\TEST")
where file.Match("txt$")
select new {
Path = file,
Name = new System.IO.FileInfo(file).Name,
CreationDate = new System.IO.FileInfo(file).CreationTime,
Directory = new System.IO.FileInfo(file).DirectoryName
};


gridview1.DataSource = selection;
gridview1.DataBind();

testiamo ed ecco il risultato:

Visual studio 2008 and framework 3.5

In questi giorni sto smanettando con la nuova versione di visual studio e soprattutto con LINQ e le query syntax

per esempio supponiamo di avere una lista di nomi e cognomi in questo formato "cognome nome" e di volere ordinare per nome..
un operazione che può sembrare semplice ma che in realtà è piu complicata del previsto..

utilizzando le query syntax e usando LINQ è possibile risolvere quest' operazione in poche righe ad esempio:


var developers = new String[]{
"Carlesso Cristian",
"Giammarchi Andrea",
"Scott Guthrie"
};

var selections = from dev in developers
orderby dev.Split(' ')[1]
select dev;

gridview1.DataSource = selections;
gridview1.DataBind();

vediamo passo per passo quello che ho fatto:
con

var developers = new String[]{
..
}

ho definito un vettore di 3 stringhe nel formato "cognome nome"
da notare che ho utilizzato var anzichè l' equivalente String[]



var selections = from dev in developers
orderby dev.Split(' ')[1]
select dev;

ecco in tutto il suo splendore la query syntax,
tradotta in italiano equivarebbe a qualcosa come:
per ogni stringa contenuta all' interno di developers creami una variabile temporanea
dev che contiene la stringa, poi ordinami le stringhe in base
alla parte a destra dello split ottenuto considerando spazio come token
e ritornami il risultato all' interno di selections



gridview1.DataSource = selections;
gridview1.DataBind();

con queste 2 istruzioni andiamo a popolare un gridview di una pagina aspx

lanciamo il debug e vediamo in output il seguente risultato:





bello ma non mi piace molto il titolo della colonna della GridView.. Item non ha molto senso dopotutto...
perciò torniamo sul codice e modifichiamo la query in

var selections = from dev in developers
orderby dev.Split(' ')[1]
select new {Developer = dev};


cosi facendo abbiamo rinominato la colonna....

e nel frattempo vi ho mostrato qualcosa che sarà molto più utile in uno dei prossimi post..