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

2024-01-06

是否可以使用递归输出以下 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 });

页面在哪里

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

怎么样:

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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 使用递归从 List 创建 HTML 无序列表 的相关文章

随机推荐

  • 如何使用 datetime Python 模块计算当前日期六个月后的日期?

    我正在使用 datetime Python 模块 我正在计算从当前日期算起 6 个月的日期 有人可以帮我做这件事吗 我想要生成距离当前日期 6 个月的日期的原因是为了生成审核日期 如果用户将数据输入系统 系统将有一个自输入数据之日起 6 个
  • 如何让 z3 返回多个 unsat 核心、多个令人满意的作业

    我正在研究一个研究工具的一个组件 我有兴趣检索 对于 QF LRA 多个 最少或其他 UNSAT核心以及 多项 SAT 作业 我检查了论坛以获取有关此主题的早期讨论 例如 在逻辑 QF LRA 上使用 z3 时如何获得不同的 unsat 核
  • 从另一个 HBITMAP 复制位图

    我正在尝试编写一个类来在我的程序中包装位图功能 一个有用的功能是从另一个位图句柄复制位图 我有点卡住了 void operator MyBitmapType bmp HDC dcMem HDC dcSource if m hBitmap b
  • WPF - 使ListView(GridView)滚动时数据太多?

  • 当未找到 id 时,查询会产生 1 行包含空值的结果

    确切的查询 SELECT coupon coupons code coupon coupons discountType作为 类型 coupon coupons discountAmount作为 金额 coupon coupons disc
  • 复合键的 Hibernate 标准问题

    我得到了这个休眠映射
  • Ogre g++ 编译时错误

    在ubuntu上 我已经编译并安装了所有的ogre库 但是 当我尝试使用此命令编译教程时 g o otest ogre cpp I pkg config libs cflags OGRE OIS lOgreMain lOI 它输出 tmp
  • PostgreSQL 上不存在 Doctrine 列 id

    我被迫使用PostgreSQL 我已经读过一些相关内容 但它仍然是新的 我不知道为什么会收到此错误 SQLSTATE 42703 Undefined column 7 ERROR column t0 id does not exist LI
  • 线程或服务

    我对 Android 上的线程和服务感到困惑 如果我必须从服务器下载一些文件 一次可能有多个文件 在这种情况下我应该选择什么 线程还是服务 在这种情况下我应该选择什么线程或服务 这不是一个 或 这是一个 和 您使用后台线程and一项服务 从
  • 以编程方式创建可同步的 Android 日历

    我开发了一个应用程序功能 可以通过应用程序创建和同步本地电话日历 现在我必须在线同步此日历 最好通过本机电话帐户 我尝试通过帐户名称和类型扩展 URI 的内容值参数 请参阅下面的 API LVL id sync account sync a
  • gnuplot 中的历史记录自动完成

    在 gnuplot 中 我输入 gnuplot gt set style data lines 然后我运行其他几行 gnuplot gt plot data traj1 dat u 1 4 u 1 6 u 1 9 u 1 11 u 1 13
  • 当我将其构建为 Android 应用程序包时,为什么我的 Android 应用程序无法运行?

    我想开始将我的应用程序发布为 AAB 我成功构建了我的构建 aab文件并决定尝试在我的手机上安装应用程序 我用下一个方法 1 使用命令从 aab 文件构建 APK 集 java jar bundletool jar build apks b
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • Android 库项目自定义构建

    我有一个遗留应用程序 需要将其拆分为一个库项目 通用代码 和两个应用程序项目 付费和免费应用程序 我不使用 Eclipse 进行开发 也不使用 Android SDK 提供 生成 的 Ant 构建 有几个原因 不同的项目目录结构 集成到构建
  • 使用java从jar作为资源播放.wav文件

    我想使用 jar 文件中的 java 代码作为资源来播放 wav 文件 我的代码是这样的 try URL defaultSound getClass getResource images ads WindowsNavigationStart
  • 如何获取HTTP 404响应的响应内容

    有没有比直接通过 tcp 访问主机更简单的方法来获取 HTTP 404 响应的内容 这是 404 响应的示例 内容如下 HTTP 1 1 404 Object Not Found Server CouchDB 1 3 0 Erlang OT
  • 连接分层模块:SystemVerilog 中的结构与接口

    在 SystemVerilog 中 分层模块可以通过简单数据类型 复杂数据类型 结构 联合等 或接口进行连接 我感兴趣的功能是将两个模块之间的所有信号聚合到一个地方 这简化了代码的维护 例如 在下面的例子中 更改 s point 的定义而不
  • 是否将指针移动到结构成员 UB 的后面?并访问它?

    看看这个片段 struct S float x y z void fn S s 0 0 0 float p s x p 2 1 if constexpr sizeof S sizeof float 3 if S has no padding
  • 复制链表中的结构

    在这里 我将结构从一个节点复制到另一个节点 但是当我遇到最后一个节点时 我将出现分段错误 因为temp clsf gt next in memcpy将指向无效位置 我该如何解决这个问题 我无法自由temp clsf因为它不是动态分配 whi
  • C# 使用递归从 List 创建 HTML 无序列表

    是否可以使用递归输出以下 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 原始数据保存在