1

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

这是每个节点的结构:

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; }    
}

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

我还希望按名称对子节点和叶节点进行排序。(>= 可扩展,o= 叶)

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);

4

1 回答 1

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;
}
于 2013-07-01T12:38:33.237 回答