1

我正在尝试使用 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 等?能否请你帮忙?

4

2 回答 2

1

您可以使用 aStack来模拟递归行为,而无需实际使用递归。

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接受单个节点的方法,因为它会造成混淆,使该方法看起来不是递归的。

于 2013-02-19T15:27:45.757 回答
1
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; 
    }
}
于 2013-02-19T15:20:26.600 回答