That's why I have this little guy:
public static void Each<T>(this IEnumerable<T> enumerable, Action<T> action) { foreach (var element in enumerable) action(element); }
It's pretty basic but I like the way it looks and feels. I used it in my blog post about a C# UpTo Extension Method a la Ruby's int.upto method.
Here's a simple demonstration I wrote in LinqPad:
void Main() { Enumerable.Range(1, 5).Each(Console.WriteLine); } static class Extensions { public static void Each<T>(this IEnumerable<T> source, Action<T> action) { foreach (var element in source) action(element); } }
In writing this post (and perhaps because I've been spending way too much time with jQuery lately), it occurred to me that I may want to be able to chain my actions with another Each() or with other extensions from Linq perhaps:
void Main() { Enumerable.Range(1, 5).Each(Console.WriteLine).Each(Console.WriteLine); // 1 2 3 4 5 1 2 3 4 5 } static class Extensions { public static IEnumerable<T> Each<T> (this IEnumerable<T> source, Action<T> action) { foreach (var element in source) action(element); return source; } }
The problem is though, that generally you don't want your action to enumerate your enumerable until something is to be done with the results. Instead, you often want it to be executed during the enumeration of your enumerable, so you'd write it like this:
void Main() { Enumerable.Range(1, 10) .Each(Console.WriteLine) .Where(i => i <= 5) .ToList(); // 1 2 3 4 5 6 7 8 9 10 Console.WriteLine(); Enumerable.Range(1, 10) .Each(Console.WriteLine) .Take(5) .ToList(); // 1 2 3 4 5 Console.WriteLine(); Enumerable.Range(1, 10) .Each(Console.WriteLine) .Skip(5) .Take(5) .ToList(); // 1 2 3 4 5 6 7 8 9 10 } static class Extensions { public static IEnumerable<T> Each<T> (this IEnumerable<T> source, Action<T> action) { foreach (var element in source) { action(element); yield return element; } } }
No comments:
Post a Comment