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