Visual C# Developer Center > Visual C# Forums > Visual C# Language > Recursive functions, directory traversal.
Ask a questionAsk a question
 

AnswerRecursive functions, directory traversal.

  • Wednesday, November 04, 2009 4:02 PMRobinsonUK Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    Hi,

    Is there a way to recursively iterate a collection, gathering up items into another collection?  As a simple example, consider a inline function that is given a directory and that gathers up all of the files in that directory and all subdirectories, into a single collection.  It's pretty easy to make a recursive function to do this, but I was wondering if it could be done with linq style functors, or similar syntactic goodness.

    Thanks.

Answers

  • Wednesday, November 04, 2009 4:21 PMDavid M MortonMVP, ModeratorUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     Answer

    You could write a simple extension method to perform recursive tasks:

    public static class ObjectExtensions
    {
        public static IEnumerable<T> Recurse<T>(this T value, Func<T, IEnumerable<T>> recursed)
        {
            yield return value;

            foreach (T rItem in recursed(value))
            {
                foreach (var innerItem in rItem.Recurse(recursed))
                    yield return innerItem;

            }
        }
    }

    Try this usage of the above method:

    foreach (var item in @"C:\program files\".Recurse(d => Directory.GetDirectories(d)))
        Console.WriteLine(item);


    Coding Light - Illuminated Ideas and Algorithms in Software
    Coding Light WikiLinkedInForumsBrowser
    • Proposed As Answer byRobert Varga Wednesday, November 04, 2009 4:23 PM
    • Marked As Answer byRobinsonUK Wednesday, November 04, 2009 4:26 PM
    •  

All Replies

  • Wednesday, November 04, 2009 4:21 PMDavid M MortonMVP, ModeratorUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     Answer

    You could write a simple extension method to perform recursive tasks:

    public static class ObjectExtensions
    {
        public static IEnumerable<T> Recurse<T>(this T value, Func<T, IEnumerable<T>> recursed)
        {
            yield return value;

            foreach (T rItem in recursed(value))
            {
                foreach (var innerItem in rItem.Recurse(recursed))
                    yield return innerItem;

            }
        }
    }

    Try this usage of the above method:

    foreach (var item in @"C:\program files\".Recurse(d => Directory.GetDirectories(d)))
        Console.WriteLine(item);


    Coding Light - Illuminated Ideas and Algorithms in Software
    Coding Light WikiLinkedInForumsBrowser
    • Proposed As Answer byRobert Varga Wednesday, November 04, 2009 4:23 PM
    • Marked As Answer byRobinsonUK Wednesday, November 04, 2009 4:26 PM
    •  
  • Wednesday, November 04, 2009 4:26 PMRobinsonUK Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    Nice.  I like it.  Thanks.