Вы ничего не делаете с результатом выражения, и, вероятно, ленивая оценка не применяется. Если вы действительно хотите игнорировать результат выражения, по крайней мере попробуйте добавить ToArray () в конце;) Это должно привести к выполнению оценки и рекурсивно вызвать вашу функцию Traverse.
Преимущество решения Bojan (при условии, что вы действительно этого хотите, потому что оно возвращает результат, отличный от вашего первоначального), заключается в том, что фактическая ответственность за оценку переходит к клиенту метода Traverse. Поскольку в вашем случае это запросы в памяти, в любом случае, разница невелика, но если бы это были запросы к базе данных, то было бы более значительное снижение производительности (количество реальных запросов к базе данных) для помещения ToArray куда-либо.