代码之家  ›  专栏  ›  技术社区  ›  Nicholas Murray

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

  •  1
  • Nicholas Murray  · 技术社区  · 14 年前

    <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 });
    

    页面所在位置

        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);
                }
            }
        }
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    怎么样:

    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);
    
        2
  •  2
  •   heisenberg    14 年前

    抱歉,我第一次尝试时错过了递归位,这应该会得到您想要的结果:

            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>");
        }