C#使用递归从列表创建HTML无序列表

C#使用递归从列表创建HTML无序列表,c#,html,recursion,html-lists,C#,Html,Recursion,Html Lists,是否可以使用递归输出以下HTML无序列表 <ul> <li>1 <ul> <li>5 <ul> <li>8</li> <li>9</li> </ul> </l

是否可以使用递归输出以下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>
这是我到目前为止所做的,当然不完全有效

        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);
            }
        }
    }
foreach(页面中的变量页面)
{
Console.WriteLine(“
  • {0}”,page.pageId); WriteMenu(页面,page.pageId,page.parentPageId); } 公共静态void WriteMenu(列表页、int-pageId、int-parentPageId) { foreach(页面中的变量页面) { 如果(page.parentPageId==pageId) { Console.WriteLine(“
    • {0}”,page.pageId); WriteMenu(页面,page.pageId,page.parentPageId); } } }
那么:

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);
publicstaticboolwritemenu(列表页、int-parentId、int-indent)
{
字符串填充=新字符串(“”,缩进*8);
bool writenany=false;
foreach(页面中的var页面,其中(p=>p.ParentPageId==parentId))
{
if(!writenany)
{                
Console.WriteLine();
Console.WriteLine(填充+“
    ”); writenany=true; } Write(padding+“
  • {0}”,page.PageId); if(WriteMenu(pages,page.PageId,缩进+1)) { Console.WriteLine(填充+“
  • ”); } 其他的 { Console.WriteLine(“”); } } 如果(写入) { Console.WriteLine(填充+“
”); } 回报率; } ... WriteMenu(第0页,第0页);
那么:

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);
publicstaticboolwritemenu(列表页、int-parentId、int-indent)
{
字符串填充=新字符串(“”,缩进*8);
bool writenany=false;
foreach(页面中的var页面,其中(p=>p.ParentPageId==parentId))
{
if(!writenany)
{                
Console.WriteLine();
Console.WriteLine(填充+“
    ”); writenany=true; } Write(padding+“
  • {0}”,page.PageId); if(WriteMenu(pages,page.PageId,缩进+1)) { Console.WriteLine(填充+“
  • ”); } 其他的 { Console.WriteLine(“”); } } 如果(写入) { Console.WriteLine(填充+“
”); } 回报率; } ... WriteMenu(第0页,第0页);
抱歉,我第一次尝试时错过了递归位,这应该会得到您想要的结果:

        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>");
    }
Console.WriteLine(
    ); foreach(页面中的变量页面) { 如果(page.parentPageId==0) { WriteMenu(第页,第页); } } Console.WriteLine(“
”); 专用静态无效写入单元(列表页,第页) { Console.WriteLine(“
  • ”+page.pageId); var子页面=pages.Where(p=>p.parentPageId==page.pageId); 如果(子页面.Count()>0) { 控制台写入线(
      ); foreach(第p页,分页) { if(pages.Count(x=>x.parentPageId==p.pageId)>0) 书面材料(第页,第页); 其他的 Console.WriteLine(string.Format(“
    • {0}
    • ”,p.pageId)); } Console.WriteLine(“
    ”); } Console.WriteLine(“
  • ”); }
    抱歉,我第一次尝试时错过了递归位,这应该会得到您想要的结果:

            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>");
        }
    
    Console.WriteLine(
      ); foreach(页面中的变量页面) { 如果(page.parentPageId==0) { WriteMenu(第页,第页); } } Console.WriteLine(“
    ”); 专用静态无效写入单元(列表页,第页) { Console.WriteLine(“
  • ”+page.pageId); var子页面=pages.Where(p=>p.parentPageId==page.pageId); 如果(子页面.Count()>0) { 控制台写入线(
      ); foreach(第p页,分页) { if(pages.Count(x=>x.parentPageId==p.pageId)>0) 书面材料(第页,第页); 其他的 Console.WriteLine(string.Format(“
    • {0}
    • ”,p.pageId)); } Console.WriteLine(“
    ”); } Console.WriteLine(“
  • ”); }
    就快到了。。。2,3,4,7部分与我的示例不同。@Nicholas:好的,经过编辑-我相信它现在看起来与您的示例完全一样-只是您的示例出于某种原因遗漏了第6项;)太好了,谢谢,有一次六角体恐惧症。。。很抱歉快到了。。。2,3,4,7部分与我的示例不同。@Nicholas:好的,经过编辑-我相信它现在看起来与您的示例完全一样-只是您的示例出于某种原因遗漏了第6项;)太好了,谢谢,有一次六角体恐惧症。。。很抱歉