我有以下类型:
public class Category
{
public string Id { get; set; }
public string ParentId { get; set; }
public string Title { get; set; }
}
顶级类别的
ParentId
值为 0。任何子类别都通过 ParentId
属性与其各自的父类别相关。
我正在尝试实现一种很好的方法来确定哪个是树中的最后一个子节点(无论树有多深),因此在下面的示例中,我希望返回“笔记本电脑”条目(或其 ID 在至少):
Id:10 ParentId:0 标题:出售
Id:5 ParentId:10 标题:计算机
Id:20 ParentId:5 标题:笔记本电脑
即层次结构为“待售”>“计算机”>“笔记本电脑”。
此层次结构可能仅包含 1 个类别,或者在某些情况下可能有 5 个以上的子级。
使用 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());
使用 LINQ,您可以像这样简单地实现此目的:
var FilteredData = ParentChildData.Where(x => (parentChildData.All(y => y.ParentId != x.Id))).ToList();