【问题标题】:Removing Tree Branches with C#使用 C# 删除树枝
【发布时间】:2013-02-22 06:09:38
【问题描述】:

我在 C# 中有一个名为 itemsList<Leaf>。叶子具有以下属性:

public class Leaf
{
  public int ID { get; set; }

  public int ParentID { get; set; }

  public bool IsFlagged { get; set; }
}

如果 Leaf 设置了 IsFlagged 属性,那么我需要将其从项目集合中删除。此外,我需要删除该 Leaf 实体的所有子级。我试图找出编写这段代码的最优雅的方式。目前,我在一个循环中有一个循环,但它看起来很草率。

有人知道这样做的优雅方法吗?

【问题讨论】:

  • 你能告诉我们你到目前为止的代码吗?
  • “叶子实体的孩子”是什么意思?如果它是一片叶子,它不应该没有孩子吗?
  • @SWeko 看来该类的名称不正确。应该叫Node
  • 对于树节点(叶子或不叶子)存储其父节点而不是子节点的引用是很不寻常的。通常,您将整棵树存储为对根的引用,然后从那里向下移动到叶子。如果你愿意,你可以让它双向,并给每个节点一个指向父节点的指针。顺便提一句。我建议您使用实际的对象引用,而不是 ID。另请注意,在树中,根、叶或内部节点之间通常没有区别。一切都是一个节点。

标签: c# tree


【解决方案1】:

也许:

void RemoveItAndChildren(Leaf leaf)
{
    foreach (Leaf item in items)
        if (item.ParentID == leaf.ID)
            RemoveItAndChildren(item);
    items.Remove(leaf);
}

这样使用:

foreach (Leaf leaf in items)
    if (leaf.IsFlagged)
        RemoveItAndChildren(leaf);

请注意,正如上面的评论,以下内容可能更合适:

public class Leaf2
{
    List<Leaf2> Children;
    bool IsFlagged { get; set; }
}

【讨论】:

  • @Servy 是的。这正是我的代码所做的。 (注意它会先移除孩子,以免失去他们的孩子。)
  • 对,错过了。请注意,这是一个特别低效的解决方案,因为您以嵌套方式多次迭代列表。
  • 但是,如果你有一棵树有五层深,而叶子在第三层呢?那就是我有问题的地方。此解决方案仅针对顶层。
  • @JQueryMobile 因为从您的问题看来,all 的叶子都在一个大列表中 - 无论它是什么级别,这段代码都不会错过任何叶子。 - 代码(在:“And use so:”中)通过 Leaf 的 all
【解决方案2】:

处理树的最合理(也可能是“最优雅”)的方式是将其存储为树,而不是数组/列表。在这种情况下,您无需处理步行元素即可尝试找到所有孩子。

请注意,根据您的实际需求,树可能不是最好的数据结构,但要删除具有所有子节点的节点,很难击败常规树。

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 2021-06-19
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2012-07-27
    相关资源
    最近更新 更多