将最后一个孩子放在自引用分层树中

时间:2015-04-16 15:46:00

标签: c# relationship hierarchy hierarchical-data

我有以下类型:

public class Category
{
    public string Id { get; set; }
    public string ParentId { get; set; }
    public string Title { get; set; }
}

顶级类别的ParentId值为0.任何子类别都通过ParentId属性与其各自的父级相关。

我正在尝试实现一种很好的方法来确定哪个是树中的最后一个子树(无论树是多么深),所以在下面的例子中,我希望返回'Laptops'条目(或者至少Id):

  

ID :10 ParentId :0 标题:待售

     

ID :5 ParentId :10 标题:计算机

     

ID :20 ParentId :5 标题:笔记本电脑

即。该等级为“待售”> '计算机'> '笔记本电脑'。

此层次结构可能只包含1个类别,或者在某些情况下可能包含5个以上的儿童。

2 个答案:

答案 0 :(得分:3)

使用LINQ,您可以像这样实现:

var LeafNodes = YourItemsList.Where(x => !YourItemsList.Any(y => y.ParentID == x.Id));

现在你可以遍历这个可枚举项,并且对于每个项目,你可以走上父节点以获得完整的链。

答案 1 :(得分:2)

通过创建以父ID作为键的查找,您可以轻松找到给定节点的所有子节点,从而可以轻松找到没有子节点的所有节点。

var lookup = categories.ToLookup(category => category.ParentId);
var leaves = categories.Where(category => !lookup[category.Id].Any());