C# 如何过滤树结构?

C# 如何过滤树结构?,c#,tree,C#,Tree,我有一个对象树MyNode: public class MyNode { public int Type { get; set; } public List<MyNode> Children { get; set; } } MyNode myRootNode; // initializing a tree structure 我有一个例外:集合被修改;枚举操作可能无法执行。我想这是因为我删除了列表中的元素。有没有正确的方法?或者我做错了什么?假设始终保留根节点,您可以

我有一个对象树
MyNode

public class MyNode
{
   public int Type { get; set; }
   public List<MyNode> Children { get; set; }
}

MyNode myRootNode;
// initializing a tree structure

我有一个例外:
集合被修改;枚举操作可能无法执行。
我想这是因为我删除了列表中的元素。有没有正确的方法?或者我做错了什么?

假设始终保留根节点,您可以删除mathod中的子节点,而不是节点本身

bool Filter(MyNode node,int type)
{
//remove children
foreach(MyNode child in node.Children.Where(c=>!Filter(c, type)).ToArray())
    node.Children.Remove(child);
//return if should be retained
return node.Type==type || node.Children.Count>0;
}

林克来救你:

public static void RemoveNodesRecursive(this MyNode node, Predicate<MyNode> predicate)
{
    node.Children.RemoveAll(predicate);
    foreach (var n in node.Children)
    {
        RemoveNodes(n);
    }
}

您是否确实需要修改just filter的初始集合(选择满足条件的项)?
public static void RemoveNodesRecursive(this MyNode node, Predicate<MyNode> predicate)
{
    node.Children.RemoveAll(predicate);
    foreach (var n in node.Children)
    {
        RemoveNodes(n);
    }
}
myRootNode.RemoveNodesRecursive(n => n.node.Type == myType)