public static class LinqExtensions
{
public static IEnumerable<T> Recurse<T>(this T source, Func<T, IEnumerable<T>> getChildren) where T : class
{
if (source == null)
return new List<T>();
List<T> result = getChildren(source).Recurse<T>(getChildren).ToList();
result.Insert(0, source);
return result;
}
public static IEnumerable<T> Recurse<T>(this T source, Func<T, T> getChild) where T : class
{
if (source != null)
yield return source;
T child = getChild(source);
while (child != null)
{
yield return child;
child = getChild(child);
}
}
public static IEnumerable<T> Recurse<T>(this IEnumerable<T> source, Func<T, T> getChild) where T : class
{
List<T> result = new List<T>();
if (source != null)
{
foreach (T child in source)
result.AddRange(child.Recurse<T>(getChild));
}
return result;
}
public static IEnumerable<T> Recurse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> getChildren) where T : class
{
if (source != null)
{
foreach (T child in source)
{
if (child != null)
yield return child;
IEnumerable<T> subChildren = getChildren(child);
if (subChildren != null)
{
foreach (T subChild in subChildren.Recurse<T>(getChildren))
{
if (subChild != null)
yield return subChild;
}
}
}
}
}
}
Here's an example of how to use them:
public class Node
{
public List<Node> Children = new List<Node>();
}
Node parent = new Node();
IEnumerable<Node> children = parent.Recurse(x => x.Children);
No comments:
Post a Comment