by
Granville Barnett | 24 September 2007
In the
previous page, we wrapped our look at how LINQ and XML
work. The final topic that I will cover in this page
concerns lambda expressions. Read on to find out more!
Many people find lambda expressions fairly hard to get to
grips with, so we will take some time to create some basic
lambda expressions and then replicate some queries of
in-memory collections and relational data using lambda
expressions. If you have ever done any functional
programming before in a language such as Haskell or F# then
you will be familiar with the syntax of lambda expressions –
if you have no experience with either, then don’t worry. We
will go through lambda expressions now with a series of
practical examples.
The first thing to clear up is the basic structure of a
lambda expression; this takes the form of args =>
expression. For the first example we will create a function
that returns the square of any given integer argument:
- Func<int,
int>
square
= x
=> x
* x;
- Console.WriteLine(square(3));
In this example we create a lambda expression that takes
one argument (x) of type int, and returns an int. To the
left of the => token is our single argument, and to the
right of the => token is our expression (x*x).
Let’s now apply what we have just learned to filtering an
in-memory collection. Just as before, our lambda expression
will take a single argument, but this time return a Boolean
value determined by whether or not the argument satisfied
the expression:
- List<string>
people
= new
List<string>(){
"Granville",
-
"Rachel",
-
"John",
-
"Ross",
-
"Monica" };
-
- IEnumerable<string>
expr =
people.Where(x
=> x.Length
> 4);
- foreach
(string
person
in
expr)
{
- Console.WriteLine(person);
- }
Here we pass in an inline lambda expression to the Where
extension method, in this case the parameter is of type
string and the expression returns true only if the string
has a length of greater than four characters.
For our final example we will use a lambda expression to
select only the AuthorName property of the Author entity
instead of creating an anonymous type. First we show how we
would do this returning an anonymous type:
- BookShop
db =
new
BookShop(_conn);
-
- var
authors
=
from a
in
db.Authors
-
select
new {
a.AuthorName
};
-
- foreach
(var
author
in
authors)
{
- Console.WriteLine(author.AuthorName);
- }
Next we perform the same operation using a lambda
expression:
- BookShop
db =
new
BookShop(_conn);
-
- IEnumerable<string>
authors
= db.Authors.Select(x
=> x.AuthorName);
- foreach
(string
author
in
authors)
{
- Console.WriteLine(author);
- }
I strongly recommend that you familiarize yourselves with
lambda expressions as they are incredibly useful when using
LINQ. At the time of writing lambda expressions look set to
become the de facto standard, with anonymous delegates
playing a more subdued role in the future C# 3.0 language.
The simplicity and flexibility of LINQ has been shown
throughout this article – it truly provides developers with
a consistent language to query several data stores via
several methods. An important fact to remember is that LINQ
is still in early CTP stages, so logically it will only get
better! I encourage everyone to further explore what LINQ
can do, and more importantly how it can make your life a lot
easier.
If you have any questions, please contact me or post on
the forums.
|