我有一堆数据将表示为树。我正在使用的控件要求正确排序数据。
这是每个节点的结构:
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);
)
答案 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;
}