CodePaste Logo
New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets Web Code Search Snippets Search
Sign inor Register
Language: C#

Traverse Extension Sample App

902 Views
Copy Code Show/Hide Line Numbers
class Program
{
static void Main()
{
    var list = new List<MyClass> {new MyClass(10), new MyClass(20)};
 
    foreach(var l in list)
    {
        l.MyList = new List<MyClass> {new MyClass(10)};
    }
    
    var total = list.Traverse(x => x.MyList).Sum(x => x.Val);
 
    Console.WriteLine(total);
    Console.ReadLine();
}
}
public static class MyExtensions
{
//The Traverse extension can be added to types of IEnumerable<T>.
//Returns T
//Input Param
//"fnRecurse" - delegate with one parameter T and returns IEnumerable<T>
 
public static IEnumerable<T> Traverse<T>
       (this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
{
    foreach (T item in source)
    {
        yield return item;
 
        var seqRecurse = fnRecurse(item);
 
        if (seqRecurse != null)
        {
 
//Making Recursive call to Traverse using 
//results from the lambda expression 
            foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse))
            {
                yield return itemRecurse;
            }
        }
    }
}
}
 
public class MyClass
{
public MyClass(int val)
{
    Val = val;
}
 
public int Val;
public List<MyClass> MyList = new List<MyClass>();
}
by Jason Rowe
  September 21, 2009 @ 2:24pm

Add a comment


Report Abuse
brought to you by:
West Wind Techologies



If you find this site useful and use it frequently please consider making a donation to support this free service.
Donate