Spesso mi capita di dover attraversare ricorsivamente un grafo di oggetti, pensate a delle folder che hanno all’interno delle altre folder che hanno all’interno delle altre folder e via così.. Mi sono chiesto è possibile creare un Extension Method che faccia questo lavoro e in base ad una condizione mi restituisca, ad esempio, la folder con un nome o un id voluto ?
1: public static class FindRecorsive
2: {
3: public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
4: {
5: foreach (T item in source)
6: {
7: yield return item;
8:
9: var seqRecurse = fnRecurse(item);
10:
11: if (seqRecurse != null)
12: foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse))
13: yield return itemRecurse;
14: }
15: }
16: }
Bene ora è semplice utilizzare questo Extension Method per raggiungere il nostro scopo
Entità
1: public class Item
2: {
3: public int Id { get; set; }
4: public List<Item> Items { get; set; }
5: }
Utilizzo
1: var find = items.Traverse(item => item.Items).FirstOrDefault(i => i.Id == 100);
Sonny