Во-первых, обратите внимание, что все идет по плану, пока мы перебираем элементы, у которых нет родного брата.Как только мы нажимаем на элемент <c>
, все начинает ухудшаться.Также интересно, что <c>
, <d>
и <e>
все думают, что они содержат <f>
детей.
Давайте подробнее рассмотрим ваш звонок на SelectMany()
:
_context.SelectMany(n => n.ChildNodes)
, который перебирает элементы в _context
, а накапливает дочерние узлы каждого элемента.Давайте посмотрим на _context
.Все должно быть хорошо, так как это List
длины 1
.Или это так?
Я подозреваю, что ваш конструктор SharpQuery(string)
хранит элементы одного уровня в одном и том же списке.В этом случае _context
может больше не иметь длину 1
и, помните, SelectMany()
накапливает дочерних узлов каждого элемента в списке.
Например, если_context
- это список, содержащий <c>
, <d>
, <e>
и <f>
, только у <f>
есть дочерние элементы, а SelectMany()
вызывается один раз для каждого элемента, он накапливает и возвращает дочерние элементы <f>
четыре раза.
Я думаю, что это ваша ошибка.
РЕДАКТИРОВАТЬ: Поскольку вы опубликовали полный класс, мне не нужно больше догадыватьсяПосмотрите на последовательность операций при выполнении итерации по <b>
(итераторы заменены списками для лучшего понимания):
- Вызов
Children()
на <b>
, который возвращает <c>
, <d>
, <e>
и <f>
, - Вызовите
Traverse()
в полученном списке: - Вызовите
Children()
на <c>
, , но _context
на самом делесодержит <c>
, <d>
, <e>
и <f>
, а не только <c>
, поэтому возвращает <g>
, <h>
и <i>
, - Call
Children()
on <d>
, то же самое, поскольку _context
является одинаковым для и <c>
и <d>
(и <e>
, и <f>
), - Пена, промыть, повторить.