VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
C# CoreCông cụ hằng ngày
Bài 17/19
5 phút

LINQ cơ bản

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Lọc sản phẩm còn hàng, sắp xếp theo giá, lấy tên, tính tổng tiền. Viết bằng foreach thì mỗi việc tốn năm sáu dòng. LINQ làm mỗi việc chỉ trong một dòng, bằng lambda đã học ở bài trước.

Khái niệm

🔎 LINQ: bộ method có sẵn để lọc, sắp xếp, biến đổi và tính toán trên collection, nhận lambda làm điều kiện.

Ví dụ

var products = new List<Product>
{
    new Product("Bút bi", 5000m, 120),
    new Product("Vở", 12000m, 0),
    new Product("Balo", 350000m, 8),
};

List<string> names = products
    .Where(p => p.Stock > 0)
    .OrderBy(p => p.Price)
    .Select(p => p.Name)
    .ToList();

Console.WriteLine(string.Join(", ", names));
// Bút bi, Balo

class Product
{
    public string Name { get; }
    public decimal Price { get; }
    public int Stock { get; }

    public Product(
        string name, decimal price, int stock)
    {
        Name = name;
        Price = price;
        Stock = stock;
    }
}
  • Các method nối nhau bằng dấu chấm và chạy lần lượt từ trên xuống: lọc còn hàng, xếp theo giá, lấy tên.
  • ToList() gom kết quả thành List.
  • string.Join(", ", names) ghép các phần tử thành một chuỗi.
Where: Stock > 0 OrderBy: Price Select: Name products: Bút bi, Vở, Balo Bút bi, Balo Bút bi 5000, Balo 350000 names: Bút bi, Balo
Dữ liệu đi qua từng bước của chuỗi LINQ

Những method dùng nhiều nhất:

Method Làm gì
Where(p => ...) lọc theo điều kiện
Select(p => ...) biến mỗi phần tử thành giá trị khác
OrderBy, OrderByDescending sắp xếp tăng, giảm
First, FirstOrDefault lấy phần tử đầu tiên thoả điều kiện
Any(p => ...) có phần tử nào thoả không (bool)
Count, Sum, Max, Min đếm, cộng, lớn nhất, nhỏ nhất

Thử ngay

Chép ví dụ trên vào Program.cs, thay đoạn từ List<string> names tới dòng comment bằng:

int inStock = products.Count(p => p.Stock > 0);
decimal stockValue = products
    .Sum(p => p.Price * p.Stock);
bool hasCheap = products.Any(p => p.Price < 1000m);

Console.WriteLine(inStock);
Console.WriteLine(stockValue);
Console.WriteLine(hasCheap);

Đoán trước khi chạy: inStock là 2 hay 3?

Xem kết quả
2
3400000
False

Là 2, vì "Vở" có Stock bằng 0. Tổng giá trị kho là 5000 × 120 + 12000 × 0 + 350000 × 8.

Lỗi hay gặp

Tưởng Where sửa list gốc. LINQ không đổi collection ban đầu mà trả về kết quả mới.

// SAI — products vẫn đủ 3 món
products.Where(p => p.Stock > 0);
Console.WriteLine(products.Count);
// ĐÚNG — lưu kết quả vào biến mới
var available = products
    .Where(p => p.Stock > 0)
    .ToList();
Console.WriteLine(available.Count);

First khi không có phần tử nào khớp. Chương trình dừng với InvalidOperationException.

// SAI — lỗi khi chạy: không có món nào trên 1 triệu
var item = products.First(p => p.Price > 1000000m);
// ĐÚNG — không có thì nhận null
var item = products
    .FirstOrDefault(p => p.Price > 1000000m);
Console.WriteLine(item?.Name ?? "Không có");

Tóm tắt

  • LINQ gồm các method như Where, Select, OrderBy, Sum, nhận lambda.
  • Nối nhiều method bằng dấu chấm, gọi ToList() để lấy kết quả dạng list.
  • LINQ không sửa collection gốc, muốn dùng kết quả thì lưu vào biến.
  • Nếu có thể không tìm thấy, dùng FirstOrDefault rồi kiểm tra null.

Tự kiểm tra

0/3 câu
Câu 1

var nums = new List<int> { 5, 2, 8 }; var r = nums.OrderBy(n => n).First(); Giá trị của r là gì?

Câu 2

Bạn cần danh sách email của mọi khách hàng trong List<Customer> customers. Dùng method nào?

Câu 3

Chỉ cần biết giỏ hàng có món nào hết hàng hay không. Cách nào hợp lý nhất?

LambdaException

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt