Ultimamente sto giocando parecchio con LINQ e trovo incredibile come possa cambiare il modo di scrivere parti di codice: tutto diventa più leggibile e si ha subito l'idea di cosa una query faccia.
Oggi dovevo sfogliare tutte le sezioni di configurazioni e per ognuna chiamare il metodo ProtectSection per criptarla. Siccome ogni gruppo di configurazione ha delle sezioni e a sua volta dei sotto gruppi di configurazione, dovevo fare una funzione da richiamare in modo ricorsivo per ogni gruppo, ma non mi piaceva. La domanda che ormai mi pongo è: si può fare in LINQ? In questo caso no o almeno io non ho trovato un extension method o una combinazione di essi che facesse al caso mio. Perciò ne ho creato uno mio generico, per rendere flat una struttura ad albero:
public static class Extensions { public static IEnumerable<t /> ToFlat<t />(this IEnumerable<t /> source, Func<T, IEnumerable<T><t, />> childPredicate) { foreach (T t in source) { yield return t; IEnumerable<t /> children = childPredicate(t); foreach (T child in ToFlat(children, childPredicate)) yield return child; } } }
In pratica, prende una lista e la sfoglia restituendo ogni elemento della lista stessa. Poi attraverso un predicato ottiene i figli di ogni elemento e per ognuno chiama ricorsivamente la funzione. In questo modo si ottiene un enumeratore piatto che sfoglia tutti gli elementi di una struttura ad al albero.
L'utilizzo poi è banale. Per esempio per sfogliare tutti i controlli di una pagina (il cast serve perché ControlsCollection non implementa IEnumerable
var allControls = this.Controls.Cast<control />().ToFlat(c => c.Controls)
Semplice ed efficace, vero?
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Dettagli sul metodo SelectDTO, il 26 aprile 2009 alle 13:58
- LINQ to Reflection - Parte tre, il 20 aprile 2009 alle 07:08
- Abusi della parola chiave var e poca leggibilità dei generics, il 29 agosto 2008 alle 13:10
- Lambda Expression in Windows Presentation Foundation, il 7 agosto 2008 alle 18:49
- LINQ to reflection - Parte due, il 23 luglio 2008 alle 14:26
- Eccovi LINQ to reflection, il 19 luglio 2008 alle 21:17