屈服和递归
本文关键字:递归 屈服 | 更新日期: 2023-09-27 18:00:12
我正在尝试使用Yield设置递归逻辑。这是我的场景:我有一个NodeviewModel项目的集合,每个NodeviewModel项都可以有多个类型为NodeviewModel项的子项。图形的深度可能为"n"。基本上,我得到NodeviewModel项目并转换成不同的形式
这是代码:
public class CompositeContentBuilder
{
private readonly IContentFactory _contentFactory;
public CompositeContentBuilder(IContentFactory contentFactory)
{
_contentFactory = contentFactory;
}
public IEnumerable<IContentViewModel> BuildFrom(IEnumerable<INodeViewModel> nodes)
{
if (nodes.Count() == 1)
yield return BuildFrom(nodes.First());
foreach (var nodeViewModel in nodes)
{
yield return BuildFrom(nodeViewModel);
foreach (var viewModel in nodeViewModel.Children)
{
yield return BuildFrom(viewModel);
}
//How do I return children.children...and so on?
}
}
private IContentViewModel BuildFrom(INodeViewModel node)
{
var content = _contentFactory.Create(node);
content.Initialise();
return content;
}
}
我将如何转换children、children等等?你能帮忙吗?
您可以使用Stack
来模拟递归行为,而无需实际使用递归。
public IEnumerable<IContentViewModel> BuildFrom(IEnumerable<NodeViewModel> nodes)
{
Stack<NodeViewModel> stack = new Stack<NodeViewModel>(nodes);
while (stack.Any())
{
var next = stack.Pop();
yield return BuildFrom(next);
foreach (var child in next.Children)
{
stack.Push(child);
}
}
}
另外请注意,我建议重命名接受单个节点的BuildFrom
方法,因为这会造成混乱,使该方法在不接受单个节点时显得递归。
public IEnumerable<IContentViewModel> BuildFrom(IEnumerable<NodeViewModel> nodes)
{
foreach (var nodeViewModel in nodes)
{
yield return BuildFrom(nodeViewModel);
foreach(var child in BuildFrom(nodeViewModel.Children)) // recursive call
yield return child;
}
}