C# 获取自引用层次结构树中的最后一个子级

C# 获取自引用层次结构树中的最后一个子级,c#,relationship,hierarchy,hierarchical-data,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属性与其各自的父类别相关 我正在尝试实现一种很好的方法来确定树中的最后一个子树,无论该树有多深,因此在下面的示例中,我希望返回“Lapt

我有以下类型:

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父Id:0标题:待售

Id:5父Id:10标题:计算机

Id:20家长Id:5标题:笔记本电脑

i、 e.层次结构为“待售”>“计算机”>“笔记本电脑”


此层次结构可能仅由1个类别组成,或者在某些情况下可能有5个以上的子级。

使用LINQ,您可以简单地如下实现:

var LeafNodes = YourItemsList.Where(x => !YourItemsList.Any(y => y.ParentID == x.Id));
var lookup = categories.ToLookup(category => category.ParentId);
var leaves = categories.Where(category => !lookup[category.Id].Any());

现在,您可以迭代此可枚举项,对于每个项,您可以遍历父节点以获得完整的链。

使用LINQ,您可以像这样简单地实现这一点:

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

现在,您可以迭代此可枚举项,对于每个项,您可以遍历父节点以获得完整的链。

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

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

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

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

您的速度/内存限制是什么?您可以使用DFS或递归。您能更精确地定义last吗?这是任何分支中的最后一个子级,因为每个分支都可以有多个子级,还是最深的子级?等等。。。你有列表中的所有项目,还是只有根类别?我处理的是相同的结构,但是啊!在PHP/Javascript/MySql中。我添加了两个有用的参数:可视化顺序和分支id。然后我制作了类似IP的虚线代码,它们是唯一的,只是将所有分支id链接起来。在你的例子中,1.5.20.3.12可以出售-计算机-笔记本电脑-IBM-Thinkpad,但更容易知道你有多少1.5.20或1.5.20.3。“在自参考层次结构树中”即你的意思是一个图形,即a可以是b的父对象,是c的父对象,是a的父对象吗?如果是这样,“最后”是什么意思?您的速度/内存限制是什么?您可以使用DFS或递归。您能更精确地定义last吗?这是任何分支中的最后一个子级,因为每个分支都可以有多个子级,还是最深的子级?等等。。。你有列表中的所有项目,还是只有根类别?我处理的是相同的结构,但是啊!在PHP/Javascript/MySql中。我添加了两个有用的参数:可视化顺序和分支id。然后我制作了类似IP的虚线代码,它们是唯一的,只是将所有分支id链接起来。在你的例子中,1.5.20.3.12可以出售-计算机-笔记本电脑-IBM-Thinkpad,但更容易知道你有多少1.5.20或1.5.20.3。“在自参考层次结构树中”即你的意思是一个图形,即a可以是b的父对象,是c的父对象,是a的父对象吗?如果是,那么“last”是什么意思?这是对列表中的每一项进行线性搜索,这与集合的大小成反比。@Servy:Hmmm。。。OP说他每个类别最多可以有5个以上的项目,所以我想他错过的不会超过几微秒。但对于较大的列表,您的观点非常有效。每个类别最多有5个子类别。但是,如果执行此操作的类别有1000个……这是对列表中的每个项目进行线性搜索,这与集合的大小成反比。@Servy:Hmmm。。。OP说他每个类别最多可以有5个以上的项目,所以我想他错过的不会超过几微秒。但对于较大的列表,您的观点非常有效。每个类别最多有5个子类别。但是如果有1000个类别执行此操作。。。