LINQ на самом деле не очень хорошо делает рекурсию. Ваше решение кажется подходящим - хотя я не уверен, что HasChildren действительно требуется ... почему бы просто не использовать пустой список для элемента без детей?
Альтернативой является написание метода DescendantsAndSelf
, который будет возвращать всех потомков (включая сам элемент), что-то вроде этого;
// Warning: potentially expensive!
public IEnumerable<SomeItem> DescendantsAndSelf()
{
yield return this;
foreach (var item in Children.SelectMany(x => x.DescendantsAndSelf()))
{
yield return item;
}
}
Однако, если дерево глубокое, оно оказывается очень неэффективным, потому что каждый элемент должен «пройти» через все итераторы своего происхождения. Уэс Дайер написал в блоге об этом , показывая более эффективную реализацию.
В любом случае, если у вас есть такой метод (хотя он реализован), вы можете просто использовать обычное предложение «где» для поиска элемента (или First / FirstOrDefault и т. Д.).