1

私はオブジェクトのツリーを持っていますMyNode:

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

MyNode myRootNode;
// initializing a tree structure

したがって、次を除くすべてのノードを削除する必要があります

  1. Typeプロパティが等しいノードint myType

  2. Typeプロパティが等しい任意のレベル ノードの子ノードに含まれるノードint myType

私のやり方:

bool Filter(MyNode node, MyNode parentNode, int type)
{
   bool isFound = false;

   if (node.Type == type)
      isFound = true; // There's type

   foreach (MyNode child in node.Children)
   {
      if (FilterTree(child, node, type))
          isFound = true; // There is child node who has this type
   }

   // If there aren't this type neither any of its children has it
   if (!isFound)
   {
      parentNode.Children.Remove(node);
   }

   return isFound;
}

例外がCollection was modified; enumeration operation may not execute.あります。これは、リスト内の要素を削除したためだと思います。それを正しい方法で行う方法はありますか?または、私は何を間違っていますか?

4

2 に答える 2

4

ルート ノードが常に保持されると仮定すると、ノード自体ではなく、計算内の子を削除できます。

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;
}
于 2013-03-06T18:15:27.883 に答える
-1

Linq があなたを助けに来ます:

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)
于 2013-03-06T18:17:31.570 に答える