html - 渲染多级html列表的算法

标签 html algorithm

我想向我的网站添加评论 TreeView ,但我受困于渲染多级 UL。 假设我有一些项目[项目(父项目)]:i1(null),i2(i1),i3(null),i4(i3),i5(i4),i6(i4),i7(i3),i8 (无效的)。每个项目也有一个时间戳,最新的项目应该在最上面。

目标:

<ul>
    <li>
        <ul>
            <li>i1</li>
            <li>
                <ul>
                    <li>i2</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>
        <ul>
            <li>i3</li>
            <li>
                <ul>
                    <li>i4</li>
                    <li>
                        <ul>
                            <li>i5</li>
                            <li>i6</li>
                        </ul>
                    </li>
                    <li>i7</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>
        <ul>
            <li>i8</li>
        </ul>
    </li>
</ul>

谁能推荐一个算法?

最佳答案

找到算法here .

我的类(class)是这样的:

 public class LiItem
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Text { get; set; }
    public bool IsRendered { get; set; }
}

public class TreeViewRenderer
{
    private IEnumerable<LiItem> _liItems;

    public string Render(string treeId, IEnumerable<LiItem> liItems)
    {
        _liItems = liItems;

        StringBuilder sb = new StringBuilder();

        sb.AppendFormat("<ul id='{0}'>\r\n", treeId);

        if (_liItems.Count() == 0)
        {
            sb.AppendFormat("<li>List is empty</li>");
        }

        foreach (var item in _liItems.Where(i => !i.ParentId.HasValue))
        {
            RenderLi(sb, item);
            AppendChildren(sb, item);
        }

        sb.AppendLine("</ul>");

        return sb.ToString();
    }

    private void AppendChildren(StringBuilder sb, LiItem root)
    {
        var children = _liItems.Where(i => i.IsRendered == false && i.ParentId == root.Id);

        if (children.Count() == 0)
        {
            sb.AppendLine("</li>");
            return;
        }

        sb.AppendLine("\r\n<ul>");
        foreach (var item in children)
        {
            RenderLi(sb, item);
            AppendChildren(sb, item);
        }

        sb.AppendLine("</ul></li>");
    }

    private void RenderLi(StringBuilder sb, LiItem item)
    {
        sb.AppendFormat("<li>{0}", item.Text);
        item.IsRendered = true;
    }
}

关于html - 渲染多级html列表的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20637713/

相关文章:

c# - 帮助理解标签云算法

css - 为列表设置导航栏

javascript - jQuery Accordion 不会删除单击上一个 Accordion 时的类

javascript - 当ajax调用页面加载到div中时,如何删除 anchor 标记内链接中的哈希值

javascript - 如何选择某种元素?

algorithm - 算法设计手册是一本适合算法初学者的好书吗?

java - 如何获取 HTML <body> 的内容

php - 将 120000000 转换为 '120 mil' 的好 PHP 算法?

algorithm - 描绘汽车绕轨道的图形演示

algorithm - T(n) = T(n/2) + clog(n) = O(log(n)^2) 的归纳证明