Archive for May 2009
Rails-like ASP.NET Development Assets
Here are the slides:
*Note: Sqlite ADO.NET Provider is required to run this code. You can get it from http://sqlite.phxsoftware.com/
Hello world!
Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!
Ruby-like Times method for Ints in C#
Yesterday, @mccartsc did a presentation on Linq for a group of us at work. As part of his presentation, he demonstrated an extension method he threw together to give .NET Integers the Times method that Ruby programmers have enjoyed for years.
Basically, the n.Times methods is passed a block that it will execute n number of times. In Ruby, you could do something like this:
5.times {|x| puts x }
That trivial line of code would output integers 0 through 4.
With such a trivial use case, you may be wondering “Why would anyone want to do that?” Well, @mccartsc and I had a discussion about coding without traditional For Loops. Foreach Loops are great for enumerating IEnumerable objects, but it is not a replacement for the traditional For Loop. We thought, “Wouldn’t it be great if you could use a Ruby-like Time method to execute a block of code an arbitrary number of times?” So, @mccartsc built it as part of his Linq demonstration.
Here’s how he did it:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LinqDemo { static class Extensions { public static void Each<T>(this IEnumerable<T> collection, Action<T> action) { foreach (var item in collection) action(item); } public static IEnumerable<int> Range(this int max) { for (int i = 0; i < max; i++) yield return i; } public static void Times(this int i, Action<int> action) { i.Range().Each(action); } } }
@mccartsc created three extension methods to implement the Times method. “Each” is an extension method for IEnumerable types. It passes each member of a collection into an Action delegate.
“Range” is an extension method for Int types. It creates a zero-based IEnumerable collection out of an integer. For instance, 5.Range();, would return a collection consisting of integers 0,1,2,3,4.
Finally, “Times” is another extension method for Int types that allows a user to execute an action an arbitrary number of times by using the aforementioned Range and Each methods. Once I have these extension methods in my C# project, I can execute code like this:
5.Times(i => Console.WriteLine(i.ToString()));
The above would output:
0
1
2
3
4
I think that’s pretty cool.
Thanks @mccartsc for the code and the demonstration.
Update: @mccartsc got a blog! Check him out at http://scmccart.wordpress.com/.