C# Lambda Expressions Unveiled: Basics to Advanced

Laks Tutor
2 min readAug 10, 2023

--

Let’s deep dive into the world of lambda expressions in C#, guiding you from basic concepts to advanced techniques.

1. What are Lambda Expressions?

Lambda expressions are anonymous functions that can have expressions and statements. They are especially useful when you require a short, simple function without the need for a named definition.

2. Basic Lambda Syntax

Lambda expressions use the => operator, which can be read as "goes to."

Here’s a simple example:

Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // Outputs 25

3. Expressions vs. Statements in Lambdas

Lambdas can be written in two ways:

  • Expression Lambdas — These are short and return a value. They don’t require a return keyword.
Func<int, int> addOne = x => x + 1;
  • Statement Lambdas — These can have multiple statements enclosed in {}.
Action<string> greet = name => 
{
string greeting = $"Hello, {name}!";
Console.WriteLine(greeting);
};

4. Multiple Parameters and No Parameters

Lambdas can have multiple parameters or none at all:

Func<int, int, int> add = (x, y) => x + y;

Action greetWorld = () => Console.WriteLine("Hello, World!");

5. Type Inference

One of the beauties of lambda expressions in C# is type inference. You don’t always need to specify the type of parameters.

Func<int, int, int> multiply = (x, y) => x * y;

However, sometimes for clarity or to resolve ambiguities, you might want to provide the type explicitly.

6. Lambdas and LINQ

Lambdas and LINQ go hand in hand. Here’s a simple example that filters a list of numbers to get only even numbers:

var numbers = new List<int> {1, 2, 3, 4, 5, 6};
var evenNumbers = numbers.Where(n => n % 2 == 0);

7. Returning Funcs and Actions

Lambdas can be used to create factory patterns or higher-order functions:

Func<int, int> MultiplyBy(int factor) => x => x * factor;

var doubleValue = MultiplyBy(2);
Console.WriteLine(doubleValue(5)); // Outputs 10

8. Closures

Lambda expressions can capture outer variables, leading to the concept of closures:

int y = 10;
Func<int, int> addY = x => x + y;

However, be cautious about the side-effects and unintended behaviors, especially when variables can change their values outside the lambda’s scope.

9. Lambdas and Event Handling

Lambdas can also make event subscriptions more succinct:

someButton.Click += (sender, args) => MessageBox.Show("Button clicked!");

10. Advanced: Expression Trees

Expression trees represent code in a tree-like pattern, where each node is an expression. Lambda expressions can be converted to expression trees, making it possible to inspect their structure and semantics.

Expression<Func<int, int, int>> addition = (a, b) => a + b;

Expression trees are central to LINQ providers that target databases, as they allow LINQ queries to be translated into SQL.

Conclusion

Lambda expressions in C# offer developers a concise and expressive mechanism to define anonymous methods. They shine brightly in scenarios requiring short, inline functions without formal method declarations. By understanding their underpinnings, especially when combined with features like LINQ, you can write more efficient, readable, and maintainable code in C#. As you continue your C# journey, you’ll find lambdas to be invaluable companions, simplifying both logic and syntax in countless scenarios.

--

--

Laks Tutor

Software Architect & .NET expert. Specializing in Docker & Kubernetes. Freelance corporate trainer. Shaping tech & sharing insights on Medium.