c#从邻接树中排序数据

时间:2013-07-01 12:33:27

标签: c# recursion jqgrid tree

我有一堆数据将表示为树。我正在使用的控件要求正确排序数据。

这是每个节点的结构:

public class TreeNode
{
    public Guid id { get; set; }
    public string name { get; set; }
    public int level { get; set; }
    public Guid? parent { get; set; }
    public bool isLeaf { get; set; }    
}

我需要一种方法来对数据进行排序,以便我有一个首先显示root的TreeNodes列表,然后是子节点,依此类推。换句话说,所有直接孩子都需要跟随列表中的父母。

我还想按名称对子节点和叶节点进行排序。 (> = expandable,o = leaf)

root >
  level1a >         
  level1b >
     level2d >
     level2a o
  level1a o
  level1b o

有一种简单的方法吗?

我假设我需要一些递归函数,并且不能使用order by语句的组合对它进行排序(类似于list.OrderBy(x => x.parent).ThenBy(x => x.level).ThenBy(x => x.isLeaf);

1 个答案:

答案 0 :(得分:2)

你是正确的,用一个LINQ表达式做这件事并不简单。这种递归方法应该可以解决这个问题:

IEnumerable<TreeNode> TreeOrder(
    IEnumerable<TreeNode> nodes)
{
    //Find the root node
    var root = nodes.Single(node => node.parent == null);

    //Build an inverse lookup from parent id to children ids
    var childrenLookup = nodes
        .Where(node => node.parent != null)
        .ToLookup(node => node.parent.Value);

    return TreeOrder(root, childrenLookup);
}

IEnumerable<TreeNode> TreeOrder(
    TreeNode root,
    ILookup<Guid, TreeNode> childrenLookup)
{
    yield return root;

    if (!childrenLookup.Contains(root.id))
        yield break;

    foreach (var child in childrenLookup[root.id])
        foreach (var node in TreeOrder(child, childrenLookup))
            yield return node;
}