代码之家  ›  专栏  ›  技术社区  ›  mpen

为什么这段代码在DOM上迭代的速度很慢?

  •  1
  • mpen  · 技术社区  · 14 年前

    它嵌套了大约10个函数,所以我只粘贴相关的位:

    var nodes = Filter_Chunk(Traverse(), chunks.First());
    

    特别是里面的这个块 Filter_Chunk (不是双关语):

    private static IEnumerable<HtmlNode> Filter_Chunk(IEnumerable<HtmlNode> nodes, string selectorChunk)
    {
        // ...
        string tagName = selectorChunk;
        foreach (var node in nodes)
            if (node.Name == tagName)
                yield return node;
    

    里面没什么太复杂的。。。所以我想应该是 Traverse()

    public IEnumerable<HtmlNode> Traverse()
    {
        foreach (var node in _context)
        {
            yield return node;
            foreach (var child in Children().Traverse())
                yield return child;
        }
    }
    
    public SharpQuery Children()
    {
        return new SharpQuery(_context.SelectMany(n => n.ChildNodes).Where(n => n.NodeType == HtmlNodeType.Element), this);
    }
    

    我试着找到 <h3> 上的节点 stackoverflow.com


    实际上,这里肯定有一个bug,导致它返回的节点比应该返回的更多。。。 I forked the question to address the issue

    1 回复  |  直到 7 年前
        1
  •  2
  •   CodesInChaos    14 年前
    public IEnumerable<HtmlNode> Traverse()
    {
        foreach (var node in _context)
        {
            yield return node;
            foreach (var child in Children().Traverse())
                yield return child;
        }
    }
    

    我觉得这个密码很奇怪。 Children() 独立于 _context ,因此在上下文中为每个节点运行一次子节点是没有意义的。