LINQ to Objects e file system.

Linq é una tra le novità introdotte dal nuovo framework che più mi ha colpito: poter utilizzare una sintassi sql like per effettuare vere e proprie query (genere lambda expressions) su tipi che implementano l’interfaccia IEnumerable<T>.

Sempre il framework, con le classi List<T> (strongly typed list) e Array[] (generic type list),  offre "contenitori" adatti ad ospitare insiemi di oggetti(omogenei o non) su cui effettuare query LINQ senza la necessità che questi ultimi diano una definizione di IEnumerable<T>.

Gli snippet di seguito mostrano come effettuare query sui files presenti all’interno di una cartella. Allo stesso modo si potrebbe tirar fuori la lista di tutti gli utenti censiti su Active Directory facente parte di un determinato gruppo oppure effettuare query sulle tabelle di un db (Linq to Sql) e via dicendo…

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.IO;
   6:  
   7: namespace LinqFileExplorer
   8: {
   9:     public class LinqFileManager
  10:     {
  11:         private DirectoryManager directory;
  12:  
  13:         public List<FileInfo> files;
  14:  
  15:         public LinqFileManager(string path)
  16:         {
  17:             directory = new DirectoryManager(path);
  18:         }
  19:         public void Initialize()
  20:         {
  21:             files = directory.GetFileList();                        
  22:         }
  23:  
  24:         public List<FileInfo> GetFilesOrderedByName()
  25:         {
  26:             var result = from f in files orderby f.Name ascending select f;
  27:             return result.ToList();
  28:         }
  29:         public List<FileInfo> GetFilesByPartialName(string partialName)
  30:         {
  31:             var result = from f in files where f.Name.Contains(partialName) select f;
  32:             return result.ToList();
  33:         }   
  34:        
  35:     }    
  36:  
  37:     class DirectoryManager
  38:     {
  39:         private DirectoryInfo folderInfo;
  40:         public DirectoryManager(string folderPath)
  41:         {
  42:             folderInfo = new DirectoryInfo(folderPath); 
  43:         }
  44:  
  45:         public List<FileInfo> GetFileList()
  46:         {
  47:             List<FileInfo> fileInfo = folderInfo.GetFiles().ToList();
  48:             return fileInfo;
  49:         }
  50:     }
  51:  
  52: }

 

Winform di test:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel;
   4: using System.Data;
   5: using System.Drawing;
   6: using System.Linq;
   7: using System.Text;
   8: using System.Windows.Forms;
   9: using System.IO;
  10: using LinqFileExplorer;
  11:  
  12: namespace LinqFileExplorer.Winapp
  13: {
  14:     public partial class Form1 : Form
  15:     {
  16:         public List<FileInfo> files;
  17:         
  18:         LinqFileManager fileManager;
  19:         public Form1()
  20:         {
  21:             InitializeComponent();
  22:             fileManager = new LinqFileManager(@"C:\Pictures");            
  23:             fileManager.Initialize();           
  24:         }
  25:  
  26:         private void button1_Click(object sender, EventArgs e)
  27:         {
  28:             if (textBox1.Text.Trim()!= "")
  29:             {
  30:                 dataGridView1.DataSource = fileManager.GetFilesByPartialName(textBox1.Text.Trim()); 
  31:             }
  32:             else
  33:             {
  34:                 dataGridView1.DataSource = fileManager.GetFilesOrderedByName();
  35:             }
  36:         }
  37:  
  38:         private void Form1_Load(object sender, EventArgs e)
  39:         {
  40:             dataGridView1.DataSource = fileManager.GetFilesOrderedByName();
  41:         }
  42:  
  43:              
  44:         private void textBox1_KeyUp(object sender, KeyEventArgs e)
  45:         {
  46:             if (e.KeyCode == Keys.Enter)
  47:                 button1_Click(sender, e);
  48:         }        
  49:     }
  50: }