【问题标题】:C# Recursive delete nodesC#递归删除节点
【发布时间】:2018-03-28 09:35:08
【问题描述】:

我为分层数据创建了一个类。从这个类我生成自定义树视图。在将数据发送到树视图之前,我需要删除一个不以实例结尾的分支 HaveData = true

    public class Data
    {
        public List<Data> Children
        {
            get;
            set;
        }

        public bool HaveData
        {
            get;
            set;
        }
    }

之前的树视图:

1 First
1.1 Item
1.1.1 Item (HaveData = false)
1.2 Item
1.2.1 Item (HaveData = true)
...

我需要:

1 First
1.2 Item
1.2.1 Item (HaveData = true)
...

如何遍历所有节点并仅删除那些以 HaveData = false 结尾的节点? 谢谢。

【问题讨论】:

  • 如果您能提供minimal reproducible example(根据这些输入显示您的输入和预期输出),那就太棒了。
  • 您只想删除“叶子”或“分支”吗? (也只有 3 位数位置或 1 和 2 位数位置)
  • 如果Item 1.1有数据怎么办?你还想删除它吗?如果它有两个直接孩子,一个有数据,一个没有数据怎么办?
  • 如果项目 1.1 有数据 = 不要删除。如果节点有两个孩子,只删除一个,HasData=false
  • nozzleman:仅删除 1.1 abd 1.1.1。第一个节点包含节点 1.2 巫婆有数据

标签: c# list hierarchy


【解决方案1】:

这是一种递归方式:

public void DeleteBranchWithNoData()
{
    var toBeRemoved = new List<Data>();
    foreach(var child in Children)
    {
        if(!child.HaveData && (child.Children == null || !child.Children.Any()))
        {
            toBeRemoved.Add(child);
        }
        else
        {
            child.DeleteBranchWithNoData();
        }   
    }
    Children.RemoveAll(d => toBeRemoved.Contains(d));
}

从要删除的分支的顶部节点调用此方法。

You can see a live demo on rextester.

【讨论】:

    【解决方案2】:
    1. 如果元素有数据或其任何子元素有数据,则使 HaveData 为真。

    2. 删除树中 HaveData 为假的所有节点。

    3. ???

    4. 利润。

    【讨论】:

    • 加载的数据我从另一个软件获得。我不能为父母设置 HaveData=true。这仅在最后一个元素处设置。
    猜你喜欢
    • 2022-07-08
    • 2012-07-29
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多