Как я могу улучшить ComponentTraversal.GetDescendants()
с помощью LINQ?
Вопрос
public static class ComponentTraversal
{
public static IEnumerable<Component> GetDescendants(this Composite composite)
{
//How can I do this better using LINQ?
IList<Component> descendants = new Component[]{};
foreach(var child in composite.Children)
{
descendants.Add(child);
if(child is Composite)
{
descendants.AddRange((child as Composite).GetDescendants());
}
}
return descendants;
}
}
public class Component
{
public string Name { get; set; }
}
public class Composite: Component
{
public IEnumerable<Component> Children { get; set; }
}
public class Leaf: Component
{
public object Value { get; set; }
}
Ответ
Я отредактировал ответ Криса, чтобы предоставить общий метод расширения, который я 'я добавил в мою общую библиотеку.Я вижу, что это полезно и для других людей, поэтому вот оно:
public static IEnumerable<T> GetDescendants<T>(this T component, Func<T,bool> isComposite, Func<T,IEnumerable<T>> getCompositeChildren)
{
var children = getCompositeChildren(component);
return children
.Where(isComposite)
.SelectMany(x => x.GetDescendants(isComposite, getCompositeChildren))
.Concat(children);
}
Спасибо, Крис!
Кроме того,
Пожалуйста, посмотрите на ответ Люка в http://blogs.msdn.com/b/wesdyer/archive/2007/03/23/all-about-iterators.aspx.Его ответ обеспечивает лучший способ решения этой проблемы в целом, но я не выбрал его, поскольку он не был прямым ответом на мой вопрос.