AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.7" />

 NodeIterator

sealed class NodeIterator : INodeIterator
The iterator through a collection of DOM nodes.
using AngleSharp.Extensions; using System.Collections.Generic; using System.Linq; namespace AngleSharp.Dom.Collections { internal sealed class NodeIterator : INodeIterator { private readonly INode _root; private readonly FilterSettings _settings; private readonly NodeFilter _filter; private readonly IEnumerable<INode> _iterator; private INode _reference; private bool _beforeNode; public INode Root => _root; public FilterSettings Settings => _settings; public NodeFilter Filter => _filter; public INode Reference => _reference; public bool IsBeforeReference => _beforeNode; public NodeIterator(INode root, FilterSettings settings, NodeFilter filter) { _root = root; _settings = settings; _filter = (filter ?? ((NodeFilter)((INode m) => FilterResult.Accept))); _beforeNode = true; _iterator = _root.GetElements<INode>(settings); _reference = _iterator.First(); } public INode Next() { INode node = _reference; bool flag = _beforeNode; do { if (!flag) node = _iterator.SkipWhile((INode m) => m != node).Skip(1).FirstOrDefault(); if (node == null) return null; flag = false; } while (_filter(node) != FilterResult.Accept); _beforeNode = flag; _reference = node; return node; } public INode Previous() { INode node = _reference; bool flag = _beforeNode; do { if (flag) node = _iterator.TakeWhile((INode m) => m != node).LastOrDefault(); if (node == null) return null; flag = true; } while (_filter(node) != FilterResult.Accept); _beforeNode = flag; _reference = node; return node; } } }