In my last post I had discussed about anonymous methods.

I had used the following code snippet to show how anonymous methods can be used to print out a List<string>

List<string> nameList = new List<string>();

nameList.Add("Abhinaba");

nameList.Add("Kaushik");

nameList.Add("Samrat");

nameList.ForEach(
delegate (string str) { Debug.Print(str);});

jeswin's comment on that post was "the ugliness is really apparent at the callsite ... Once we see lambdas and automatic type inference in C# 3.0, a lot of people will start using it. With LINQ, at least this is as concise as Ruby. "

He hit my sweet spot about Ruby and how languages like C# are poaching into its domain. Lets see how I'd code this is Ruby

$nameList = [ "abhinaba", "kaushik", "samrat" ]
$nameList.each { |str| puts str }

This is concise and intuitive as for each element run this block of code. But with C#3.0 (LINQ) coming up, this can also be done as concisely with the usage of lambda expressions. The following code is valid C# 3.0

List<string> nameList = new List<string>{ "abhinaba", "samrat", "kaushik" };

nameList.ForEach(str => Console.WriteLine(str));

So the ugly delegates and explicit type parameters have gone away. This is concise but is it really understandable by C#'s target audience?

One more interesting thing about the code is the first line where I was able to initialize the collection by directly passing the elements using the C# 3.0 Collection Initializer.

However, I am not a great fan of adding language features like this in C#. Every language has a style and a target audience and I don't think dynamic/functional programming concepts creeping into C# is a healthy trend.