首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >收益和递归

收益和递归
EN

Stack Overflow用户
提问于 2013-02-19 23:16:57
回答 2查看 868关注 0票数 1

我正在尝试使用Yield设置递归逻辑。下面是我的场景:我有一个NodeviewModel项的集合,每个NodeviewModel项可以有多个NodeViewModel项类型的子项。图形的深度可以是'n‘。基本上,我正在获取NodeviewModel项并将其转换为不同的形式。

代码如下:

代码语言:javascript
复制
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等?你能帮帮忙吗?

EN

Stack Overflow用户

发布于 2013-02-19 23:27:46

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

代码语言:javascript
复制
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方法,因为这会造成混淆,使该方法在不是递归的情况下看起来是递归的。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14960893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档