LINQ cơ bản
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 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ànhList.string.Join(", ", names)ghép các phần tử thành một chuỗi.
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
FalseLà 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
FirstOrDefaultrồi kiểm tranull.
Tự kiểm tra
0/3 câuvar nums = new List<int> { 5, 2, 8 }; var r = nums.OrderBy(n => n).First(); Giá trị của r là gì?
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?
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?