private static List <NodeType> GetNodeTypeRootsToDelete(TypeCollection <NodeType> origSet, TypeCollection <NodeType> newSet)
{
// Walks (preorder) origSet NodeType tree and collects only deletable subtree roots.
List <NodeType> _nodeTypeRootsToDelete = new List <NodeType>();
List <NodeType> _nodeTypesToEnumerate = new List <NodeType>();
// collect only roots
foreach (NodeType rootNodeType in origSet)
{
if (rootNodeType.Parent == null)
{
_nodeTypesToEnumerate.Add(rootNodeType);
}
}
int index = 0;
while (index < _nodeTypesToEnumerate.Count)
{
NodeType currentType = _nodeTypesToEnumerate[index++];
// delete currentType if newSet does not contain it otherwise add its children to enumerator
if (newSet.GetItemById(currentType.Id) == null)
{
_nodeTypeRootsToDelete.Add(currentType);
}
else
{
_nodeTypesToEnumerate.AddRange(currentType.GetChildren());
}
}
return(_nodeTypeRootsToDelete);
}