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;
}
}
}
I really appreciate comments so please feel free to comment on my posts. Whether you agree or disagree, I'd love to hear from you. Also, feel free to link back to your own blog in your comments. You can even subscribe to an RSS feed of the comments on this thread.
© 2008 , D. Patrick Caldwell, President, Autopilot Consulting, LLC
© 2008 , D. Patrick Caldwell, President, Autopilot Consulting, LLC
click for more information
0 comments:
Post a Comment