Un pizzico di Linq nel mio Technorati plug-in
La cosa più bella nello sviluppare piccole applicazioni opensource/freeware in autonomia è quella di poter cogliere l’occasione per studiare le nuove tecnologie, o i nuovi strumenti che i nuovi framework ci danno. Per esempio, ecco la schermata del mio WPF Technorati Plug-in for Windows Live Writer:
Assumiamo che la ListBox a sinistra sia popolata con una semplice List<string>. Tale lista di stringhe viene ritornata dal web-service di Technorati, che ci restituisce per l’appunto i primi 100 tags utilizzati su un determinato blog.
La nuova funzionalità che ho aggiunto permette all’utente di filtrare l’elenco dei tags per trovare quello che vuole aggiungere: invece di scorrere a mano i 100 tags, può scrivere parte della parola nella TextBox indicata dalla Label Tags Filter. Questo è stato realizzato in Linq:
1 void filterTagsTextBox_TextChanged(object sender, TextChangedEventArgs e) 2 { 3 string filter = filterTagsTextBox.Text; 4 5 if (!string.IsNullOrEmpty(filter)) 6 { 7 IEnumerable<string> filtered = Enumerable.Where 8 (_tagsList, n => n.ToLower().Contains(filter.ToLower())); 9 _filteredTags = new List<string>(filtered); 10 tagsListBox.ItemsSource = _filteredTags; 11 } 12 else 13 { 14 tagsListBox.ItemsSource = _tagsList; 15 } 16 17 foreach (string s in _selectedTags) 18 tagsListBox.SelectedItems.Add(s); 19 }
Alla linea 5 controllo se l’utente ha effettivamente indicato un filtro: se no, imposto la proprietà ItemsSource della ListBox al membro privato della classe _tagsList, che è la List<string> di cui parlavo prima, quella ritornata da Technorati.
Se invece l’utente ha indicato un filtro, ottengo un’istanza di IEnumerable<string> filtrata usando Linq:
IEnumerable<string> filtered = Enumerable.Where(_tagsList, n => n.ToLower().Contains(filter.ToLower()));
Con una sola riga ottengo il risultato voluto. Notare che uso il metodo ToLower(), per non fare differenza tra maiuscole/minuscole. Uso il metodo Contains(), così quello che scrivete nella TextBox viene cercato all’interno della stringa: può essere all’inizio, alla fine oppure in mezzo.
Alla linea 9 creo una nuova List<string> che viene riassegnata come ItemsSource della ListBox ed il gioco è fatto.
Alla linea 17 e 18 mi occupo di riselezionare via codice gli eventuali tags selezionati prima di applicare il filtro: cambiando ItemsSource, perdo tutti i SelectedItems, per cui devo andare a rimetterli io manualmente via codice.
Technorati Tags: .NET Framework Programming Linq