The easiest way to conceptualize Lambda expressions is to
think of them as ways to write concise inline methods. For example, the
sample I wrote above could have been written instead using C# 2.0
anonymous methods like so:
Listing 3

Both anonymous methods above take a Person
type as a parameter. The first anonymous method returns a boolean
(indicating whether the Person's lastname is Guthrie). The second
anonymous method returns an integer (returning the person's age). The
lambda expressions we used earlier work the same - both expressions take a
Person type as a parameter. The first lambda returns a boolean, the
second lambda returns an integer.
In C# a lambda expression is syntactically
written as a parameter list, followed by a => token, and then followed by
the expression or statement block to execute when the expression is invoked:
<span lang=EN>params => expression</span>
So when we wrote the lambda expression:
<span lang=EN>p => p.LastName == "Guthrie" </span>
we were indicating that the Lambda we were
defining took a parameter "p", and that the expression of code to run
returns whether the p.LastName value equals "Guthrie". The fact
that we named the parameter "p" is irrelevant - I could just have
easily named it "o", "x", "foo" or any other name
I wanted.
Unlike anonymous methods, which require
parameter type declarations to
be explicitly stated, Lambda expressions permit parameter types
to be omitted and instead allow them to be inferred based on the
usage. For example, when I wrote the lambda expression p=>p.LastName
== "Guthrie", the compiler inferred that the p
parameter was of type Person because the "Where" extension
method was working on a generic List<Person> collection.
Lambda parameter types can be inferred at both
compile-time and by the Visual Studio's intellisense engine (meaning you
get full intellisense and compile-time checking when writing
lambdas). For example, note when I type "p." below how Visual
Studio "Orcas" provides intellisense completion because it knows
"p" is of type "Person":
Listing 4

Note: if you want to explicitly declare the type of a
parameter to a Lambda expression, you can do so by declaring the parameter type
before the parameter name in the Lambda params list like so:
Listing 5

Advanced: Lambda Expression Trees for Framework Developers
One of the things that make Lambda expressions particularly
powerful from a framework developer's perspective is that they can be compiled
as either a code delegate (in the form of an IL based method) or as
an expression tree object which can be used at runtime to analyze, transform or
optimize the expression.
This ability to compile a Lambda expression to an expression
tree object is an extremely powerful mechanism that enables a host of
scenarios - including the ability to build high performance object mappers
that support rich querying of data (whether from a relational database, an
active directory, a web-service, etc) using a consistent query language that
provides compile-time syntax checking and VS intellisense.