C# 3.0 : Evaluation of Lambda Expression to Language INtegrated Query (LINQ)

From code name “cool” to C# 3.0, it’s been a long journey for this amazing language with .NET Runtime. Here I am going to show you the evaluation step by step.

 

Let us assume we have generic list of integers and I need to find the even numbers from that list,

 

List<int> arrInt = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

 

C# Way: Beginners

+++++++++++++

List<int> even1 = new List<int>();

foreach (int i in arrInt)

{

    if (i % 2 == 0)

        even1.Add(i);

}

foreach (int item in even1)

{

    Console.WriteLine(item);

}

 

 

C# 1.1 Way: Using Delegate

+++++++++++++++++++

Using Predicate<T> we can call delegate and then with some existing method’s help I can get the data as I require.

 

So the method I need here will look like,

 

public static bool EvenGetter(int i2)

{

    return i2 % 2 == 0;

}

 

Now the predicate implementation seems something like,

List<int> even1 = arrInt.FindAll(new Predicate<int>(EvenGetter));

foreach (int item in even1)

{

    Console.WriteLine(item);

}

 

C# 2.0 Way: Using Anonymous Method

++++++++++++++++++++++++++

 

Anonymous Methods helps us to implement delegate without having any method.

List<int> even1 = arrInt.FindAll(delegate(int i2) { return i2 % 2 ==0; });

foreach (int item in even1)

{

    Console.WriteLine(item);

}

 

C# 3.0 Way: Using Lambda Expression

++++++++++++++++++++++++++

Hmm, this is magic. Please refer C# 3.0 Specification for more information.

 

List<int> even1 = arrInt.FindAll(i => i % 2 == 0);

foreach (int item in even1)

{

    Console.WriteLine(item);

}

 

C# 3.0 Way: Implementing LINQ

++++++++++++++++++++++

Write SQL like query as native statement, LINQ Rocks!!!

IEnumerable<int> even1 = from i in arrInt

             where i % 2 == 0

                         select i;

foreach (int item in even1)

{

    Console.WriteLine(item);

}

 

This is the actual conversion happens when you compile the above code.

IEnumerable<int> even1 = arrInt.Where(i => i % 2 == 0);

 

Actual IL (disassembled) generated code looks like,

IEnumerable<int> even1 = <>g__initLocal0.Where<int>(delegate (int i) {

        return (i % 2) == 0;

    });

 

Pure code.

 

Namoskar!!!