代码之家  ›  专栏  ›  技术社区  ›  Gerrie Schenck

从平面数据创建嵌套列表的最简单方法

  •  0
  • Gerrie Schenck  · 技术社区  · 16 年前

    List<Line> lines = new List<Line>
                                       {
                                           new Line{Id = 1, Level = 0},
                                           new Line{Id = 2, Level = 1},
                                           new Line{Id = 3, Level = 1},
                                           new Line{Id = 4, Level = 2},
                                           new Line{Id = 5, Level = 2},
                                           new Line{Id = 6, Level = 1},
                                           new Line{Id = 7, Level = 1},
                                           new Line{Id = 8, Level = 2},
                                           new Line{Id = 9, Level = 1}
                                       };
    

    每个对象都有一个id和一个级别。我想要的结果是一个嵌套列表。为此,我有一个类,它可以有一个基于级别的子类列表。

    public class NestedLine
        {
            public int Id;
            public List<NestedLine> Children = new List<NestedLine>();
        }
    

    将平面列表转换为嵌套列表的最简单方法是什么?

    1
    --2
    --3
      --4
      --5
    --6
    --7
      --8
    --9
    
    3 回复  |  直到 16 年前
        1
  •  1
  •   Adriaan Stander    16 年前

    这是我的尝试。

    呼叫码

    List<Line> lines = new List<Line>
                               {
                                   new Line{Id = 1, Level = 0},
                                   new Line{Id = 2, Level = 1},
                                   new Line{Id = 3, Level = 1},
                                   new Line{Id = 4, Level = 2},
                                   new Line{Id = 5, Level = 2},
                                   new Line{Id = 6, Level = 1},
                                   new Line{Id = 7, Level = 1},
                                   new Line{Id = 8, Level = 2},
                                   new Line{Id = 9, Level = 1}
                               };
    
    NestedLine nestedLine = Recusrsive(lines, 0);
    

    private NestedLine Recusrsive(List<Line> lines, int listPos)
    {
        NestedLine retVal = new NestedLine();
        Line line = lines[listPos];
    
        retVal.Id = line.Id;
    
        for (int iItem = listPos + 1; iItem < lines.Count; iItem++)
            if (lines[iItem].Level == line.Level + 1)
                retVal.Children.Add(Recusrsive(lines, iItem));
            else if (lines[iItem].Level <= line.Level) return retVal;
    
        return retVal;
    }
    
        2
  •  0
  •   Steve Elmer    16 年前

    你能在这里提供更多的信息吗?在我看来,您实际上是在处理一个树结构:

    1.
    -&燃气轮机;2.

    -&燃气轮机-&燃气轮机;4.
    -&燃气轮机-&燃气轮机;5.
    -&燃气轮机;6.
    -&燃气轮机;7.

    -&燃气轮机;9

    我说得对吗?如果是这样,确定较低级别节点的父节点的规则是什么?

    公共嵌套行(列表行)

        3
  •  0
  •   Ants Aasma    16 年前

    var stack = new Stack<NestedLine>();
    foreach (var line : lines) {
        while (stack.Count > line.Level) {
            // Pop items until the top element is one up from current level
            stack.Pop()
        }
        var child = new NestedLine{Id = line.Id};
        if (stack.Count > 0) {
            // if there is a parent, add the child to its children
            stack.Peek().Children.Add(child);
        }
        // add current line as the deepest item
        stack.Push(child);
    }
    NestedLine root;
    while (stack.Count) {
        root = stack.Pop();
    }
    

    免责声明:我实际上没有做太多的C#编程,所以这可能包含一些小错误。