Attraversare ricorsivamente un grafo di oggetti

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

posted @ lunedì 29 marzo 2010 12:39

Print
Comments have been closed on this topic.