首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从C#中的分层数据创建HTML无序列表

从C#中的分层数据创建HTML无序列表
EN

Stack Overflow用户
提问于 2020-07-21 00:55:30
回答 2查看 150关注 0票数 0

我正在尝试从分层数据中编写一个基本的HTML无序列表。下面是数据的样子:

代码语言:javascript
运行
AI代码解释
复制
    public class Task
    {
        public int Id { get; set; }
        public int? ParentId { get; set; }
        public string Title { get; set; }
        public Collection<Task> Tasks = new Collection<Task>( );
    }
    
    List<Task> tasks = new List<Task>( );
    
    tasks.Add( new Task { Id = 1, ParentId = null, Title = "Top task" } );
    tasks.Add( new Task { Id = 2, ParentId = 1, Title = "Subtask 1" } );
    tasks.Add( new Task { Id = 3, ParentId = 2, Title = "Subtask 2" } );
    tasks.Add( new Task { Id = 4, ParentId = 1, Title = "Subtask 3" } );
    tasks.Add( new Task { Id = 5, ParentId = 4, Title = "Subtask 4" } );

以下是我试图从上面的数据中创建的内容:

代码语言:javascript
运行
AI代码解释
复制
<ul>
    <li>Top task
    <ul>
        <li>Subtask 1
            <ul>
                <li>Subtask 2</li>
            </ul>
        </li>
    </ul>
        <ul>
            <li>Subtask 3
                <ul>
                    <li>Subtask 4</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我尝试了以下帖子,并取得了一些成功:

Return unordered list from hierarchical sql dataC# Create HTML unordered list from List using Recursion

这是我从上面的第一个链接改编的代码,它基本上是有效的,但是如果分层数据的顺序发生了变化,该方法就会在第一个不是前一个父项的子项上阻塞。例如,如果我更改数据列表的顺序,如下所示,它将跳过子任务1和2:

代码语言:javascript
运行
AI代码解释
复制
    tasks.Add( new Task { Id = 2, ParentId = 1, Title = "Subtask 1" } );
    tasks.Add( new Task { Id = 1, ParentId = null, Title = "Top task" } );
    tasks.Add( new Task { Id = 3, ParentId = 2, Title = "Subtask 2" } );
    tasks.Add( new Task { Id = 4, ParentId = 1, Title = "Subtask 3" } );
    tasks.Add( new Task { Id = 5, ParentId = 4, Title = "Subtask 4" } );
代码语言:javascript
运行
AI代码解释
复制
        public class Task
        {
            public int Id { get; set; }
            public int? ParentId { get; set; }
            public string Title { get; set; }
            public Collection<Task> Tasks = new Collection<Task>( );

            public Task FindTask( int id )
            {
                return FindTask( this, id );
            }

            private Task FindTask( Task task, int id )
            {
                if( task.Id == id )
                {
                    return task;
                }
                Task returnTask = null;
                foreach( Task child in task.Tasks )
                {
                    returnTask = child.FindTask( id );
                    if( returnTask != null )
                    {
                        break;
                    }
                }
                return returnTask;
            }
        }

        List<Task> topTasks = new List<Task>( );

        protected void GetHierarchy( int id )
        {
            List<Task> data = new List<Task>( );

            data.Add( new Task { Id = 1, ParentId = null, Title = "Top task" } );
            data.Add( new Task { Id = 2, ParentId = 1, Title = "Subtask 1" } );
            data.Add( new Task { Id = 3, ParentId = 2, Title = "Subtask 2" } );
            data.Add( new Task { Id = 4, ParentId = 1, Title = "Subtask 3" } );
            data.Add( new Task { Id = 5, ParentId = 4, Title = "Subtask 4" } );

            foreach( var row in data )
            {
                Task tasks = new Task( );
                tasks.Title = row.Title;
                tasks.Id = row.Id;
                if( row.ParentId == null )
                {
                    topTasks.Add( tasks );
                }
                else
                {
                    int parentId = row.ParentId.Value;
                    foreach( Task topTask in topTasks )
                    {
                        Task parentTask = topTask.FindTask( parentId );
                        if( parentTask != null )
                        {
                            parentTask.Tasks.Add( tasks );
                            break;
                        }
                    }
                }
            }
        }

        protected string Render( )
        {
            var s = new StringBuilder( );

            GetHierarchy( id );

            s.Append( "<ul>" );
            foreach( Task child in topTasks )
            {
                RenderTask( s, child );
            }
            s.Append( "</ul>" );

            return s.ToString( );
        }

        private void RenderTask( StringBuilder s, Task task )
        {
            s.Append( "<li>" );
            s.Append( task.Title );
            if( task.Tasks.Count > 0 )
            {
                s.Append( "<ul>" );
                foreach( Task child in task.Tasks )
                {
                    RenderTask( s, child );
                }
                s.Append( "</ul>" );
            }
            s.Append( "</li>" );
        }

我不想使用jquery treeview或任何其他组件,因为这需要一个独立的解决方案。

有没有人能建议我一个更好的方法,或者至少帮我修复我在上面实现的代码,这样数据的顺序就不会破坏递归?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-21 14:54:26

最后,我改编了C# Create HTML unordered list from List using Recursion的答案,它工作得很好。下面是我使用的代码:

代码语言:javascript
运行
AI代码解释
复制
        protected string WriteList( )
        {
            var s = new StringBuilder( );
            List<Task> tasks = new List<Task>( );

            tasks.Add( new Task { Id = 2, ParentId = 1, Title = "Subtask 1" } );
            tasks.Add( new Task { Id = 1, ParentId = null, Title = "Top task" } );
            tasks.Add( new Task { Id = 3, ParentId = 2, Title = "Subtask 2" } );
            tasks.Add( new Task { Id = 4, ParentId = 1, Title = "Subtask 3" } );
            tasks.Add( new Task { Id = 5, ParentId = 4, Title = "Subtask 4" } );


            s.Append( "<ul>" );
            foreach( var task in tasks )
            {
                if( task.ParentId == null )
                {
                    WriteTaskList( tasks, task, s );
                }
            }
            s.Append( "</ul>" );

            return s.ToString( );
        }

        private static void WriteTaskList( List<Task> tasks, Task task, StringBuilder s )
        {
            s.Append( "<li>" + task.Title );

            var subtasks = tasks.Where( p => p.ParentId == task.Id );

            if( subtasks.Count( ) > 0 )
            {
                s.Append( "<ul>" );
                foreach( Task p in subtasks )
                {
                    if( tasks.Count( x => x.ParentId == p.Id ) > 0 )
                        WriteTaskList( tasks, p, s );
                    else
                        s.Append( string.Format( "<li>{0}</li>", p.Title ) );
                }
                s.Append( "</ul>" );
            }

            s.Append( "</li>" );
        }
票数 0
EN

Stack Overflow用户

发布于 2020-07-21 03:55:38

在GetHierarchy函数中,您将按顺序遍历列表中的每个任务。如果列表中的第一个任务的parentId为空,则会将其添加到topTasks列表中。

但是,如果第一个任务有一个非空的parentId,那么它将被添加到topTasks中的父任务中。请注意,此处的父任务在topTasks列表中尚不存在,因此未插入该任务。

我会使用一个递归函数,它首先获取父任务为空的任务,然后使用该任务的id递归调用该函数,直到它到达树的底部。

一个粗略的例子:

代码语言:javascript
运行
AI代码解释
复制
Task addSubLists (List<Task> data, Task parent) {
    foreach(Task task in data) {
        if (task.parentId.Value == parent.Id.Value) {
            parent.Tasks.Add(addSubLists(data, task));
        }
    }
    return parent;
}

将顶级任务传递给函数,它会将所有子代添加到中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63005867

复制
相关文章
【HTML】HTML 列表 ( 无序列表 | 有序列表 | 自定义列表 )
列表 由于其 整齐 , 整洁 , 有序 的特征 , 类似于表格 , 但是其 组合的自由程度高于表格 , 经常用来进行布局 ;
韩曙亮
2023/03/30
3K0
【HTML】HTML 列表 ( 无序列表 | 有序列表 | 自定义列表 )
html 有序列表、无序列表、自定义列表
HTML有一个特殊元素,用于创建ordered lists(有序列表), 或数字编号列表。 有序列表以<ol>元素开始,并包含一个或多个<li>元素。 例如:
Devops海洋的渔夫
2019/05/31
4.1K0
7. html 有序列表、无序列表、自定义列表
HTML有一个特殊元素,用于创建ordered lists(有序列表), 或数字编号列表。有序列表以<ol>元素开始,并包含一个或多个<li>元素。例如:
Devops海洋的渔夫
2022/01/14
1.1K0
7. html 有序列表、无序列表、自定义列表
简单无序列表_无序列表怎么横排
实现如下图所示的简单无序列表,并为每个列表项添加超链接。每个列表项的宽度为50px,高度为30px,列表中的文字在水平和垂直方向上均居中显示,超链接初始状态和访问后的状态均为黑色无下划线,鼠标经过和点击时文字均为白色,无下划线,背景颜色为#BE3948。
全栈程序员站长
2022/09/20
6150
PyTorch入门视频笔记-从数组、列表对象中创建Tensor
Numpy Array 数组和 Python List 列表是 Python 程序中间非常重要的数据载体容器,很多数据都是通过 Python 语言将数据加载至 Array 数组或者 List 列表容器,再转换到 Tensor 类型。(为了方便描述,后面将 Numpy Array 数组称为数组,将 Python List 列表称为列表。)
触摸壹缕阳光
2020/11/12
4.9K0
用Pandas从HTML网页中读取数据
本文,我们将通过几步演示如何用Pandas的read_html函数从HTML页面中抓取数据。首先,一个简单的示例,我们将用Pandas从字符串中读入HTML;然后,我们将用一些示例,说明如何从Wikipedia的页面中读取数据。
老齐
2020/05/15
9.6K0
用Pandas从HTML网页中读取数据
html中ul和li的使用_ul列表的html结构
1. 序号可以是数字、字母、罗马数字等,可以通过list-style-type 属性设置。
全栈程序员站长
2022/09/19
3.7K0
html中ul和li的使用_ul列表的html结构
python中创建列表的方法_python中readlines
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184390.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
3.8K0
列表:创建列表
列表是Tcl语言中最重要的一种数据结构。什么是列表?列表是元素的有序集合,各个元素可以包含任何字符串,例如空格,反斜杠,换行符等。列表表现为特定结构的字符串,这意味着可以把它们赋值给一个变量,可以把它们做为参数传给命令,可以把它们嵌套到其他列表中。
Lauren的FPGA
2019/10/30
2.4K0
HTML 列表
同样,有序列表也是一列项目,列表项目使用数字进行标记。 有序列表始于 <ol> 标签。每个列表项始于 <li> 标签。
用户8442333
2021/08/21
2.1K0
HTML(列表)
自定义列表以 <dl> 标签开始。每个自定义列表项以 <dt> 开始。每个自定义列表项的定义以 <dd> 开始。
全栈开发日记
2022/05/12
3.1K0
HTML(列表)
html如何设置有序列表的列表项,HTML的有序列表
针对HTML的有序列表,由于平常使用的不是很多,刚开始使用的时候也是有遇到一些坑,有几个小问题:
全栈程序员站长
2022/07/02
3.2K0
html如何设置有序列表的列表项,HTML的有序列表
Python中将字典转换为有序列表、无序列表的方法
说明:列表不可以转换为字典 1.转换后的列表为无序列表 a = {'a' : 1, 'b': 2, 'c' : 3} #字典中的key转换为列表 key_value = list(a.keys()
用户1214487
2018/04/13
3.5K0
Python中将字典转换为有序列表、无序列表的方法
如何从列表中获取元素
观察URAM的物理管脚,不难发现A/B端口都有相应的地址、使能、读写控制信号。与BRAM不同的是URAM的读写使能信号是同一个管脚RDB_WR_A/B,其为0时执行读操作,为1时执行写操作,这意味着一旦A/B端口独立,同一端口的读写操作就无法同时发生,因此,如果采用上一篇文章中介绍的方法将其配置为两个独立的单端口RAM,其读写行为与常规的单端口RAM是不同的,进一步而言,此时的读写行为类似于NO_Change模式。
Lauren的FPGA
2019/10/30
17.6K0
HTML 速查列表
HTML 速查列表 HTML 速查列表. 你可以打印它,以备日常使用。 HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head> <body> 可见文本... </body> </html> 基本标签(Basic Tags) <h1>最大的标题</h1> <h2> . . . </h2> <h3> . . . </h3> <h4> . . . </h4> <h5> . . . </h5> <h6>最小的标题</h
机器学习和大数据挖掘
2019/07/02
1.7K0
在c#中创建Windows服务
Windows服务通常在操作系统OS启动并在后台运行应用程序时启动。Windows服务在自己的会话中执行应用程序。它可以自动启动,也可以手动暂停、停止和重新启动。
程序你好
2018/07/23
4.2K0
Excel公式技巧20: 从列表中返回满足多个条件的数据
在实际工作中,我们经常需要从某列返回数据,该数据对应于另一列满足一个或多个条件的数据中的最大值。
fanjy
2020/03/25
9.4K0
Excel公式技巧20: 从列表中返回满足多个条件的数据
从分层角度HACK网络
网络的可靠性、冗余性自从网络诞生以来就是一个不曾停止过讨论的话题,最近阿里云发布了云骨干网这一产品,引起了业界的广泛讨论,突然觉得在广域网领域有一些事情发生,比如基于阿里云骨干网的SD-WAN的Sta
SDNLAB
2018/03/28
6500
从分层角度HACK网络
c# (nop中)下拉列表(有外键)
1.在操作的界面Model中建立public List<SelectListItem> xxx(取名){ get; set; }
wfaceboss
2019/04/08
9650
C# dotnet 从后向前删除列表元素提升性能的原理
如果要从一个列表里面删除一些元素,如何做才能让性能比较高?答案是从列表的后面开始删起,从后到前删除
林德熙
2020/07/06
1.5K0

相似问题

从分层sql数据返回无序列表

59

从XML数据创建HTML无序列表

13

从嵌套的无序html列表创建Pandas数据

10

从HTML无序列表创建数组

218

使用C#以编程方式将分层数据转换为HTML无序列表

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文