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:

2 commenti:

lloyd27 ha detto...

ahahahahah
come ti sei ridotto, a lavorare per il nemico.. Rendi FF triste per questo lo sai?

Civitz ha detto...

Cavoli, sembra quasi di lavorare con l'sql all'interno di un linguaggio di programmazione... x il trattamento di dati sembra manna dal cielo...se penso al casino x ottenere la stessa cosa in C :-D