这嵌套了大约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);
}
我尝试在stackoverflow.com上找到<h3>
个节点。那应该不会超过几千个节点吗?为什么这需要几分钟才能完成?
实际上,这里肯定存在一个错误,导致它返回的节点多于它应该... I forked the question to address the issue
答案 0 :(得分:2)
public IEnumerable<HtmlNode> Traverse()
{
foreach (var node in _context)
{
yield return node;
foreach (var child in Children().Traverse())
yield return child;
}
}
这段代码对我来说很奇怪。 Children()
对于_context
是独立的,因此在_context中为每个节点一次运行子项是没有意义的。