Как я могу получить список элементов CollectionBase?
В C#, если у меня есть CollectionBase типа T, и у каждого элемента в CollectionBase может быть дочерний CollectionBase того же типа T, как я могу получить список всех объектов типа T без использования рекурсивной функции?
У LINQ есть функция, чтобы сделать это?
Заранее спасибо.
1 ответ
Уэс Дайер на самом деле написал хорошую тему на эту тему.
Что касается вашего случая, я думаю, вам понадобится итератор, вероятно, что-то вроде этого:
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T,IEnumerable<T>> f)
{
return e.SelectMany(c => f(c).Flatten(f)).Concat(e);
}
Это ответ взят здесь.
РЕДАКТИРОВАТЬ: Я просто помню, что вы также можете пройти через дерево.
public static IEnumerable<T> Traverse<T>(T item, Func<T, IEnumerable<T>> childSelector)
{
var stack = new Stack<T>();
stack.Push(item);
while (stack.Any())
{
var next = stack.Pop();
yield return next;
foreach (var child in childSelector(next))
stack.Push(child);
}
}