C#递归删除节点

时间:2018-03-28 09:35:09

标签: c# list hierarchy

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

为实例的分支
    public class Data
    {
        public List<Data> Children
        {
            get;
            set;
        }

        public bool HaveData
        {
            get;
            set;
        }
    }

之前的Treeview:

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结尾的节点? 谢谢。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:-3)

  1. 如果元素有数据或其任何子元素都有数据,则Make HaveData为true。

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

  3. ???

  4. 利润。