2013-11-14 1 views
-4

Я нашел этот метод, написанный Эрик Липпертом, чтобы пройти граф объекта:C# .Net обход объектного графа

static IEnumerable<T> Traversal<T>(T item, Func<T, IEnumerable<T>> children) 
{ 
    var seen = new HashSet<T>(); 
    var stack = new Stack<T>(); 
    seen.Add(item); 
    stack.Push(item); 
    yield return item; 
    while (stack.Count > 0) 
    { 
     T current = stack.Pop(); 
     foreach (T newItem in children(current)) 
     { 
      if (!seen.Contains(newItem)) 
      { 
       seen.Add(newItem); 
       stack.Push(newItem); 
       yield return newItem; 
      } 
     } 
    } 
} 

Кто-нибудь есть пример того, как использовать это?

+1

Что вы имеете в виду, как его использовать? У вас есть конкретная задача, которую вы пытаетесь решить? – Andrey

+0

Я имею в виду, что я хочу использовать его в качестве примера? –

+0

Вам нужно объяснение кода? –

ответ

4

Предполагая, что приложение консоли, и дерево каталогов с корнем в «C: \ TEST», вы можете сделать это:

string root = "C:\\Test"; 
var folders = Traversal(root, Directory.EnumerateDirectories); 

foreach (var folder in folders) 
    Console.WriteLine(folder); 

Вы также можете попробовать string root = "C:\\Program Files (x86)";, но вы можете получить исключение доступа с этим.

+0

Проблема в том, что файловая система предоставляет свои собственные методы для перемещения файловой структуры, которая лучше, чем этот метод. Он будет работать лучше, не будет иметь одинаковые проблемы с разрешениями и т. Д. – Servy

+1

@Servy Цель здесь - продемонстрировать использование метода Traversal. Нам все равно, если это эффективный способ рекурсивно спускаться по дереву! –