Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Filtering data with lambda expressions
Lambda expressions are anonymous functions you can define inline.
Func<int, bool> isGreaterThanZero = x => x > 0;
Console.WriteLine(isGreaterThanZero(10)) // true
Console.WriteLine(isGreaterThanZero(-4)) // false
Here, x => x > 0
is the lambda expression.
- The
=>
operator is the lambda operator. - To the left of the lambda operator you see the input parameters (
x
). - To the right of the lambda operator you see the expression that is executed when calling the function (
x > 0
).
The types of input argument and return value are not explicitly stated in the lambda expression.
They are inferred by the context.
In the example above we assign the lambda expression x => x > 0
to a variable of type Func<int, bool>
, which means a function with an int
as input (x
) and a bool
as output (x > 0
).
Lambda expressions applied
The code explained
FilterNumbers
is unchanged.
We removed the two explicitly defined filter methods IsGreaterThanZero
and IsSmallerThanZero
and put their content directly as lambda expressions into KeepPositiveNumbers
and KeepNegativeNumbers
.
In KeepPositiveNumbers
we assign the lambda expression to a variable.
In KeepNegativeNumbers
we directly pass the lambda expression as argument to FilterNumbers
.
It can't hardly get simpler
KeepPositiveNumbers
and KeepNegativeNumbers
are now really tight - that's fine.
The only method with some complexity left is FilterNumbers
.
Here, we have to enumerate the original numbers
and add them to filteredNumbers
if our filterPredicate
evaluates to true.
But isn`t the concept of filtering a collection of elements always the same, no matter if we have a collection of numbers, or timestamps, or any other type of objects?
It is! And finally we are at the heart of this tutorial: LINQ