Extension method ricorsivo per LINQ

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 ToFlat(this IEnumerable source, Func<T, IEnumerable<T>> childPredicate)
{
foreach (T t in source)
{
yield return t;

IEnumerable 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().ToFlat(c => c.Controls)

Semplice ed efficace, vero?

Nella stessa categoria

Commenti

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TagCloud
BLOG INFO
  • Post: 178
  • Commenti: 81
  • TrackBacks: 39
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA