是否可以使用递归输出以下HTML无序列表。
<ul>
<li>1
<ul>
<li>5
<ul>
<li>8</li>
<li>9</li>
</ul>
</li>
<li>6</li>
</ul>
</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>7</li>
</ul>
原始数据保存在以下列表中
List<Page> pages = new List<Page>();
pages.Add(new Page { Id = 1, pageId = 1, parentPageId = 0 });
pages.Add(new Page { Id = 2, pageId = 2, parentPageId = 0 });
pages.Add(new Page { Id = 3, pageId = 3, parentPageId = 0 });
pages.Add(new Page { Id = 4, pageId = 4, parentPageId = 0 });
pages.Add(new Page { Id = 5, pageId = 5, parentPageId = 1 });
pages.Add(new Page { Id = 6, pageId = 6, parentPageId = 1 });
pages.Add(new Page { Id = 7, pageId = 7, parentPageId = 0 });
pages.Add(new Page { Id = 8, pageId = 8, parentPageId = 5 });
pages.Add(new Page { Id = 9, pageId = 9, parentPageId = 5 });
Page是
public class Page
{
public int Id { get; set; }
public int pageId { get; set; }
public int parentPageId { get; set; }
}
这是我到目前为止所做的当然不能完全发挥作用......
foreach (var page in pages)
{
Console.WriteLine("<ul><li>{0}", page.pageId);
WriteMenu(pages, page.pageId, page.parentPageId);
}
public static void WriteMenu(List<Page> pages, int pageId, int parentPageId)
{
foreach (var page in pages)
{
if (page.parentPageId == pageId)
{
Console.WriteLine("<ul><li>{0}", page.pageId);
WriteMenu(pages, page.pageId, page.parentPageId);
}
}
}
答案 0 :(得分:3)
怎么样:
public static bool WriteMenu(List<Page> pages, int parentId, int indent)
{
string padding = new string(' ', indent * 8);
bool writtenAny = false;
foreach (var page in pages.Where(p => p.ParentPageId == parentId))
{
if (!writtenAny)
{
Console.WriteLine();
Console.WriteLine(padding + "<ul>");
writtenAny = true;
}
Console.Write(padding + " <li>{0}", page.PageId);
if (WriteMenu(pages, page.PageId, indent + 1))
{
Console.WriteLine(padding + " </li>");
}
else
{
Console.WriteLine("</li>");
}
}
if (writtenAny)
{
Console.WriteLine(padding + "</ul>");
}
return writtenAny;
}
...
WriteMenu(pages, 0, 0);
答案 1 :(得分:2)
抱歉,错过了我第一次刺伤的递归位,这应该得到你想要的结果:
Console.WriteLine("<ul>");
foreach (var page in pages)
{
if (page.parentPageId == 0)
{
WriteMenu(pages, page);
}
}
Console.WriteLine("</ul>");
private static void WriteMenu(List<Page> pages, Page page)
{
Console.WriteLine("<li>" + page.pageId);
var subpages = pages.Where(p => p.parentPageId == page.pageId);
if (subpages.Count() > 0)
{
Console.WriteLine("<ul>");
foreach (Page p in subpages)
{
if (pages.Count(x => x.parentPageId == p.pageId) > 0)
WriteMenu(pages, p);
else
Console.WriteLine(string.Format("<li>{0}</li>", p.pageId));
}
Console.WriteLine("</ul>");
}
Console.WriteLine("</li>");
}