24 Biểu thức Lambda

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ư FuncAction để tạo ra các phương thức inline mà không cần khai báo trước.

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ặc statements: 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 delegate MathOperation.

4. Sử dụng Lambda với FuncAction

C# cung cấp sẵn các delegate tổng quát như FuncAction:

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ếu x 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ức createMultiplier đã hoàn thành.

10. Tóm lại

Tính năngLambda giúp
Cú pháp ngắn gọnViết hàm trực tiếp thay vì khai báo phương thức riêng.
Kết hợp với LINQDễ 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.
ClosuresNhớ 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.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *