2013-11-14 82 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方法。我們不在乎這是否是遞歸下降樹的有效方式! –