1
我理解廣度優先,但在處理一對多兒童關係時遇到問題。使用寬度優先遍歷時,如何在顯示樹時保持間距?
我的對象模型是父 - >兒童(很多)
隨着代碼,我現在,我只是寫一個字符串生成一個文件,但在未來我將使用Excel的自動化。
確切的問題是維護標籤,以便孩子正確顯示。每個孩子也可能有孩子。
{
Queue<UserStory> storiesQueue = new Queue<UserStory>();
StringBuilder printDocument = new StringBuilder();
foreach (var userStorey in _rallyDownloader.GetUserStories().OrderBy(story => story.Name))
{
storiesQueue.Enqueue(userStorey);
}
int tabs = 0;
while (storiesQueue.Count > 0)
{
string tab = "";
for (int i = 0; i < tabs; i++)
{
tab += "|----";
}
var story = storiesQueue.Dequeue();
printDocument.Append(tab + story.Name + "\n");
tabs++;
foreach (var child in story.Children)
{
string cTab = "";
for (int i = 0; i < tabs; i++)
{
cTab += "|----";
}
printDocument.Append(cTab + child.Name + "\n");
foreach (var storey in child.Children)
{
storiesQueue.Enqueue(storey);
}
}
}
}
我試圖保持原有的根數,並在到達終點,但有可能是一個更簡單的方法時,Tab鍵。
我避免遞歸,因爲我正在處理大型數據集並遇到內存問題。
我結束了使用堆棧的想法和創建此代碼。
StreamWriter stream = new StreamWriter(@"C:\awesomeSaucer.txt", true);
Stack<UserStory> storiesQueue = new Stack<UserStory>();
Stack<string> indentation = new Stack<string>();
foreach (var userStorey in _rallyDownloader.GetUserStories().OrderBy(story => story.Name))
{
storiesQueue.Push(userStorey);
indentation.Push("");
}
while (storiesQueue.Count > 0)
{
string tab = indentation.Pop();
var story = storiesQueue.Pop();
stream.WriteLine(tab + story.Name + "\n");
// printDocument.Append(tab + story.Name + "\n");
foreach (var child in story.Children)
{
indentation.Push(tab + "----");
storiesQueue.Push(child);
}
}
stream.Close();
這不是針對您的特定問題的解決方案,但它可能會激發解決方案;在這裏我向使用深度優先搜索解決這個問題的人們提出挑戰,並且我得到了幾十個有趣的解決方案:http://blogs.msdn.com/b/ericlippert/archive/2010/09/09/old-school-tree- display.aspx我的個人解決方案如下:http://blogs.msdn.com/b/ericlippert/archive/2010/09/09/eric-s-solution-for-old-school-tree-dumping.aspx – 2012-02-03 23:25:09
謝謝,我會檢查一下。 – tylerjgarland 2012-02-03 23:34:05