我正在尝试使用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等?你能帮帮忙吗?
发布于 2013-02-19 23:27:46
您可以使用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方法,因为这会造成混淆,使该方法在不是递归的情况下看起来是递归的。
https://stackoverflow.com/questions/14960893
复制相似问题