分层列表C#上的编号项目

时间:2018-11-15 09:18:07

标签: c# recursion tree hierarchical

我有一个类型为Element的层次结构列表。每个Element都有一个ParentElement和一个ChildElements的集合。

我编写了一个递归HTML帮助器,以遍历层次结构列表并将每个Element打印到表行中。我希望能够根据它们在层次结构列表中的位置来标记表中的每个元素。例如

Example List

子结构没有子元素

上层建筑有3个ChildElements-上层,框架和屋顶

上层地板和框架没有子元素

屋顶有2个ChildElements-屋顶覆盖物和屋顶结构

在调用递归帮助器的视图上有以下HTML。

<table class="table table-bordered">
     <thead>
         <tr>
             <td>Reference</td>
             <td>Name</td>
         </tr>
     </thead>
     <tbody>
         @ShowTreeTable(Model.Elements, 1)
     </tbody>
</table>

递归帮助器如下。

@helper ShowTreeTable(List<Entities.Entities.Element> elements, int level)
{
    for (int i = 0; i < elements.Count(); i++)
    {
        <tr>
            <td>@level</td>
            <td>@elements[i].Name</td>
        </tr>

        if (elements[i].ChildElements.Any())
        {
            @ShowTreeTable(elements[i].ChildElements.ToList(), level + 1)
        }
    }
}

在尝试执行此操作时,我有一个更精致的帮助程序,但是它没有关闭,因此我将其剥离给了它。

在当前示例中,结果是这样显示的。

Current Example Results

1 个答案:

答案 0 :(得分:0)

我通过在C#中将树放入视图之前对其进行处理来完成这项工作。

首先,我获得了根元素,并将其引用属性设置为它们在列表中的位置(+1)。

function rotLeft(a, d) {
    var arr = [];
    for (var i = 0; i < a.length; i++) {
        arr.push(a[i]);
    };
    for (var j = 1; j <= d; j++) {
        arr.shift(arr.push(arr[0]));
    }
    return arr;
}

然后,我编写了另一个递归方法来更新所有子元素引用。棘手的部分是在给所有子级父元素提供自己的引用之前,先对其进行更新。如果不这样做,则所有子元素都包含对没有更新后引用的父元素的引用。

var roots = this.Elements.Where(x => !x.ParentElementId.HasValue).ToList();

this.Elements.Where(x => !x.ParentElementId.HasValue).ToList()
    .ForEach(x => x.Reference = (roots.IndexOf(x) + 1).ToString());

这与OP中的HTML代码结合在一起,可以得到正确的层次结构引用。

enter image description here