Being able to traverse a tree structure can be very handy, or flatten a tree to a list. Linq doesn't offer this out of the box, but it's a fairly straightforward extension to add.
/// <summary> /// Recusively traverse a tree structure /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="childrenSelector">Child navigation property on T</param> /// <returns>Flattened collection</returns> public static IEnumerable<T> Traverse<T>(this IEnumerable<T> collection, Func<T, IEnumerable<T>> childrenSelector) { foreach (var item in collection) { yield return item; var children = childrenSelector(item); if (children != null) { foreach (var child in Traverse(children, childrenSelector)) { yield return child; } } } }
The source is pretty much straight from here, with an extra check against null children collections.
No comments:
Post a Comment