Itertools for C#
If you are a C# developer and haven't taken a look at the itertools python module so far, you owe it to yourself to learn about it. It's a module with functions that operate on what Python calls "iterables" (IEnumerable in C#). Go ahead, take a look at it before reading on.
This got me interested about implementing similar functions in C#, using IEnumerable<T>. I fired up VS 2008 and started cranking out the code, only to find that most of the itertools functions are already implemented as extension methods on IEnumerable<T> in .NET 3.5. Some of the functions even have the same name, like Repeat and TakeWhile. I found four functions that weren't directly available as IEnumerable<T> methods and decided to implement them. Let's take a look at them, one by one.
Chain
IEnumerable<T> Chain<T>(params IEnumerable<T>[] iterables)
Chain returns one flat view of all the enumerators chained together. IEnumerable<T>.Concat does the same thing, but you'll have to call it multiple times to chain more than one iterator. Chain can be used to do things like
IEnumerable<int> e1 = new List<int>() { 1, 2, 3};
IEnumerable<int> e2 = new List<int>() { 4, 5, 6};
IEnumerable<int> e3 = new List<int>() { 7, 8, 9};
IEnumerable<int> chained = Itertools.Chain(e1, e2, e3);
foreach(int element in chained)
{
Console.WriteLine(element); // prints 1 2 3 4 5 6 7 8 9
}
The implementation is fairly straightforward, thanks to the incredibly useful yield statement.
public static IEnumerable<T> Chain<T>(params IEnumerable<T>[] iterables)
{
foreach(IEnumerable<T> iterable in iterables)
{
foreach (T t in iterable)
{
yield return t;
}
}
}
Next up is the Cycle method. We'll see how it works in the next blog post.