Biểu thức lambda trong C# là một cách ngắn gọn để định nghĩa các hàm vô danh (anonymous functions), giúp mã nguồn trở nên súc tích và dễ đọc hơn. Chúng thường được sử dụng kết hợp với các delegate như Func
và Action
để tạo ra các phương thức inline mà không cần khai báo trước.
Contents
- 1 1. Tại sao cần sử dụng biểu thức Lambda?
- 2 2. Cú pháp của biểu thức Lambda
- 3 3. Sử dụng biểu thức Lambda với Delegate
- 4 4. Sử dụng Lambda với Func và Action
- 5 5. Lambda với LINQ
- 6 6. Biểu thức Lambda trong sự kiện
- 7 7. Biểu thức Lambda với nhiều tham số
- 8 8. Lambda với biểu thức phức tạp
- 9 9. Lambda và Closures
- 10 10. Tóm lại
1. Tại sao cần sử dụng biểu thức Lambda?
- Viết mã ngắn gọn hơn: Thay vì khai báo một phương thức riêng lẻ hoặc sử dụng delegate thông thường, Lambda giúp mã nguồn gọn gàng hơn.
- Dễ đọc hơn trong các thao tác xử lý dữ liệu, như LINQ.
- Linh hoạt: Có thể truyền các hàm như tham số hoặc gán vào delegate một cách trực tiếp.
2. Cú pháp của biểu thức Lambda
Cơ bản:
(parameters) => expression
Có khối lệnh:
(parameters) => { statements; }
Giải thích:
parameters
: Tham số truyền vào, có thể là một hoặc nhiều.expression
hoặcstatements
: Phần thân hàm, là biểu thức hoặc các câu lệnh.
3. Sử dụng biểu thức Lambda với Delegate
Delegate đóng vai trò như “hộp chứa” cho các hàm. Lambda là cách nhanh nhất để “nạp” các hàm vào delegate.
Ví dụ 1: Delegate cơ bản với Lambda
delegate int MathOperation(int x, int y);
class Program
{
static void Main()
{
MathOperation add = (a, b) => a + b; // Lambda thực hiện phép cộng
MathOperation multiply = (a, b) => a * b; // Lambda thực hiện phép nhân
Console.WriteLine(add(5, 3)); // Output: 8
Console.WriteLine(multiply(5, 3)); // Output: 15
}
}
Giải thích:
(a, b) => a + b
: Đây là biểu thức lambda, được sử dụng để gán vào delegateMathOperation
.
4. Sử dụng Lambda với Func
và Action
C# cung cấp sẵn các delegate tổng quát như Func
và Action
:
Func
- Delegate với kiểu trả về.
- Cú pháp:
Func<tham số đầu vào..., kiểu trả về>
.
Ví dụ:
Func<int, int, int> divide = (x, y) => x / y;
Console.WriteLine(divide(10, 2)); // Output: 5
Action
- Delegate không có kiểu trả về (kiểu
void
). - Cú pháp:
Action<tham số đầu vào...>
.
Ví dụ:
Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello Lambda!"); // Output: Hello Lambda!
5. Lambda với LINQ
LINQ (Language Integrated Query) là một tính năng mạnh mẽ của C# để truy vấn dữ liệu. Biểu thức Lambda thường được sử dụng trong LINQ để lọc, sắp xếp hoặc nhóm dữ liệu.
Ví dụ: Lọc danh sách số chẵn
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(x => x % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6
}
}
}
Giải thích:
x => x % 2 == 0
: Biểu thức Lambda trả vềtrue
nếux
là số chẵn.Where
: Một phương thức LINQ áp dụng biểu thức Lambda để lọc các số.
6. Biểu thức Lambda trong sự kiện
Lambda có thể được sử dụng để định nghĩa hàm xử lý sự kiện một cách nhanh chóng.
Ví dụ:
using System;
class Program
{
static void Main()
{
EventHandler handler = (sender, e) => Console.WriteLine("Event triggered!");
ButtonClick(handler);
}
static void ButtonClick(EventHandler handler)
{
Console.WriteLine("Button clicked.");
handler.Invoke(null, EventArgs.Empty);
}
}
Giải thích:
(sender, e) => Console.WriteLine("Event triggered!")
: Lambda đóng vai trò là phương thức xử lý sự kiện.
7. Biểu thức Lambda với nhiều tham số
Lambda có thể xử lý nhiều tham số cùng lúc.
Ví dụ:
Func<int, int, int, int> calculate = (a, b, c) => a + b - c;
Console.WriteLine(calculate(10, 5, 3)); // Output: 12
8. Lambda với biểu thức phức tạp
Nếu biểu thức Lambda có nhiều câu lệnh, bạn có thể dùng {}
để nhóm lại thành khối lệnh.
Ví dụ:
Func<int, int, int> power = (baseNum, exponent) =>
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result *= baseNum;
}
return result;
};
Console.WriteLine(power(2, 3)); // Output: 8
Giải thích:
- Lambda ở đây chứa một khối lệnh phức tạp, gồm cả vòng lặp và câu lệnh
return
.
9. Lambda và Closures
Lambda có thể “nhớ” biến bên ngoài phạm vi của nó, gọi là closure.
Ví dụ:
Func<int, int> createMultiplier(int factor)
{
return x => x * factor;
}
var multiplier = createMultiplier(3);
Console.WriteLine(multiplier(5)); // Output: 15
Giải thích:
- Biến
factor
được giữ lại trong biểu thức Lambda, ngay cả khi phương thứccreateMultiplier
đã hoàn thành.
10. Tóm lại
Tính năng | Lambda giúp |
---|---|
Cú pháp ngắn gọn | Viết hàm trực tiếp thay vì khai báo phương thức riêng. |
Kết hợp với LINQ | Dễ dàng truy vấn và xử lý dữ liệu. |
Sự kiện và Delegate | Định nghĩa phương thức xử lý một cách nhanh chóng. |
Closures | Nhớ giá trị của biến bên ngoài trong phạm vi Lambda. |
Biểu thức Lambda là một công cụ mạnh mẽ trong C#, giúp tăng tính linh hoạt, cải thiện hiệu suất và làm cho mã nguồn dễ đọc hơn. Việc sử dụng Lambda hiệu quả sẽ giúp bạn tối ưu hóa cả thời gian viết mã lẫn hiệu suất của ứng dụng.