Trong bài này, chúng ta tiếp tục các toán tử truy vấn trong LINQ.
1. Toán tử bằng nhau
Tên phương thức | Mô tả | Cú pháp diễn giải truy vấn C# |
---|---|---|
SequenceEqual | Xác định xem 2 tập dữ liệu có bằng nhau hay không bằng cách so sánh các phần tử theo từng cặp. | không áp dụng |
Ví dụ chúng ta có 3 danh sách với mỗi phần tử kiểu số nguyên, sau đó chúng ta sẽ so sánh danh sách 1 và 2, danh sách 1 và 3 để xem kết quả.
// dammio.com - Toán tử bằng nhau var list1 = new List<int> { 1, 2, 3 }; var list2 = new List<int> { 1, 2, 3 }; var list3 = new List<int> { 1, 2, 3, 4 }; // list1 và list2 là bằng nhau if (list1.SequenceEqual(list2)) Console.Write("list1 bằng list2 \r\n"); else Console.Write("list1 không bằng list2 \r\n"); // list1 và list3 không bằng nhau if (list1.SequenceEqual(list3)) Console.Write("list1 bằng list3 \r\n"); else Console.Write("list1 không bằng list3 \r\n"); // Kết quả //-- list1 bằng list2 //-- list1 không bằng list3
2. Toán tử phần tử
Toán tử phần tử trả về 1 phần tử đơn, cụ thể từ 1 tập. Các phương thức toán tử truy vấn chuẩn được mô tả thông qua bảng sau.
Tên phương thức | Mô tả | Cú pháp diễn giải truy vấn C# |
---|---|---|
ElementAt | Trả về phần tử tại 1 vị trí cụ thể trong 1 tập hợp | không áp dụng |
ElementAtOrDefault | Trả về phần tử tại 1 vị trí cụ thể trong 1 tập hợp hoặc 1 giá trị mặc định nếu vị trí đó nằm ngoài tập hợp. | không áp dụng |
First | Lấy giá trị đầu tiên của 1 tập hợp hoặc giá trị đầu tiên thỏa mãn 1 điều kiện nào đó. | không áp dụng |
FirstOrDefault | Lấy giá trị đầu tiên của 1 tập hợp hoặc giá trị đầu tiên thỏa mãn 1 điều kiện nào đó. Trả về giá trị mặc định nếu không có phần tử nào thỏa mãn. | không áp dụng |
Last | Trả về phần tử cuối của 1 tập hợp, giá trị cuối thỏa mãn 1 điều kiện nào đó. | không áp dụng |
LastOrDefault | Trả về phần tử cuối của 1 tập hợp, giá trị cuối thỏa mãn 1 điều kiện nào đó. Trả về giá trị mặc định nếu không có phần tử nào thỏa mãn. | không áp dụng |
Single | Trả về 1 phần tử duy nhất của 1 tập hợp, hay chỉ 1 phần tử thỏa mãn 1 điều kiện nào đó. | không áp dụng |
SingleOrDefault | Trả về 1 phần tử duy nhất của 1 tập hợp, hay chỉ 1 phần tử thỏa mãn 1 điều kiện nào đó. Trả về giá trị mặc định nếu không có phần tử nào thỏa mãn. | không áp dụng |
Sau đây là ví dụ áp dụng các phương thức trên để lấy dữ liệu từ 1 danh sách kiểu số nguyên.
// dammio.com - Toán tử phần tử (Element Operation) var list1 = new List<int> { 51, 61, 7, 8, 10, 98 }; int x1 = list1.ElementAt(1); // a = 61 //int x2 = list1.ElementAt(78); // Lỗi, index 78 nằm ngoài mảng (0->5) int x3 = list1.ElementAtOrDefault(78); // x3 = 0, (mặc định kiểu int là 0) int x4 = list1.First(); // x4 = 51 int x5 = list1.Last(); // x5 = 98 //int x6 = list1.SingleOrDefault(x => x > 5); // Lỗi, trả về nhiều hơn 1 giá trị int x7 = list1.SingleOrDefault(x => x > 97); // x = 98 int x8 = list1.SingleOrDefault(x => x > 98); // không tìm thấy, trả về mặc định là x8 = 0
3. Các dạng chuyển đổi dữ liệu
Các phương thức chuyển đổi thay đổi dạng đối tượng đầu vào. Các toán tử chuyển đổi trong các truy vấn LINQ được sử dụng ở nhiều ứng dụng khác nhau. Một số ví dụ:
- Phương thức Enumerable.AsEnumerable<TSource> có thể được dùng để ẩn việc thực thi tùy chọn của 1 kiểu của 1 toán tử truy vấn chuẩn.
- Phương thức Enumerable.OfType<TResult> có thể được sử dụng để kích hoạt các tập hợp không có tham số cho các truy vấn LINQ.
- Các phương thức Enumerable.ToArray<TSource>, Enumerable.ToDictionary, Enumerable.ToList<TSource>, và Enumerable.ToLookup có thể dùng để buộc thực thi truy vấn ngay lập tức thay vì trì hoãn cho đến khi truy vấn được thực thi.
Tên phương thức | Mô tả | Cú pháp diễn giải truy vấn C# |
---|---|---|
AsEnumerable | Trả về đầu vào dạng IEnumerable |
không áp dụng |
AsQueryable | Chuyển kiểu IEnumerable thành kiểu IQueryable. | không áp dụng |
Cast | Chuyển các phần tử 1 tập thành 1 dạng cụ thể. | Sử dụng 1 dạng biến phạm vị rõ ràng. Ví dụ: from string str in words |
OfType | Lọc các giá trị, phụ thuộc vào khả năng của nó có thể được chuyển đổi thành 1 dạng cụ thể. | không áp dụng |
ToArray | Chuyển 1 tập hợp thành 1 mảng. Phương thức này ép buộc việc thực thi truy vấn. | không áp dụng |
ToDictionary | Đặt các phần tử thành kiểu Dictionary |
|
ToList | Chuyển 1 tập thành kiểu List |
không áp dụng |
ToLookup | Đặt các phần tử thành Lookup |
không áp dụng |
Ví dụ sau Cast dạng Student thành dạng FullTimeStudent (from FullTimeStudent stu in students) sau đó tìm những sinh viên ở địa chỉ “1 Heaven” và xuất ra kết quả.
class Student { public string Name { get; set; } } class FullTimeStudent : Student { public string Address { get; set; } } class Program { static void Main(string[] args) { Student[] students = new Student[] { new FullTimeStudent { Name = "Dammio", Address = "1 Heaven" }, new FullTimeStudent { Name = "John", Address = "1 Heaven" }, new FullTimeStudent { Name = "Tom", Address = "2 Hell" }, new FullTimeStudent { Name = "David", Address = "2 Hell" }}; var query = from FullTimeStudent stu in students where stu.Address == "1 Heaven" select stu; foreach (Student stu in query) Console.WriteLine(stu.Name); /* Đoạn code sau cho ra kết quả: Dammio John */ Console.ReadLine(); } }
4. Toán tử kết nối
Như đã trình bày các phần trước, toán tử kết nối dùng để thực thi việc chèn 1 tập dữ liệu vào 1 tập khác hay nói cách khác là kết nối 2 tập dữ liệu với nhau.
Tên phương thức | Mô tả | Cú pháp diễn giải truy vấn C# |
---|---|---|
Concat | Kết nối 2 tập dữ liệu thành 1 tập mới | không áp dụng |
Ví dụ sau nối 2 tập số nguyên list1 và tập list2 với nhau thông qua phương thức Concat().
//--- dammio.com ------------------------------- List<int> list1 = new List<int> { 0, 5, 6 }; List<int> list2 = new List<int> { 11, 1, 16, 8 }; // Nối (concat) tập list2 vào tập list1 var query = list1.Concat(list2); foreach(var item in query) { Console.WriteLine(item); } /*Kết quả 0 5 6 11 1 16 8 */
5. Toán tử tổng hợp
Toán tử tổng hợp thực thi tính toán 1 giá trị đơn từ 1 tập các giá trị. Ví dụ của toán tử tổng hợp là tính toán nhiệt độ trung bình của tháng với số liệu có sẵn trong hàng ngày.
Tên phương thức | Mô tả | Cú pháp diễn giải truy vấn C# |
---|---|---|
Aggregate | Thực thi 1 toán tử tổng hợp tự tạo dựa trên giá trị của 1 tập dữ liệu. | không áp dụng |
Count | Đếm số phần tử của 1 tập hợp, tùy chọn chỉ những phần tử thỏa mãn 1 hàm predicate. | không áp dụng |
LongCount | Đếm số phần tử của 1 tập hợp lớn, tùy chọn chỉ những phần tử thỏa mãn 1 hàm predicate. | không áp dụng |
Max | Xác định giá trị lớn nhất trong 1 tập hợp. | không áp dụng |
Min | Xác định giá trị nhỏ nhất trong 1 tập hợp. | không áp dụng |
Sum | Tính tổng các giá trị trong 1 tập hợp. | không áp dụng |
Ví dụ sau lấy nhiệt độ trung bình, cao nhất, thấp nhất của 1 tập nhiệt độ.
//--- dammio.com ------------------------------- List<double> temperatures = new List<double> { 25, 15, 32.5, 17.8, 21 }; double averageTemp = temperatures.Average(); // nhiệt độ trung bình 22.26 double maxTemp = temperatures.Max(); // nhiệt độ cao nhất 32.5 double minTemp = temperatures.Min(); // nhiệt độ thấp nhất 15 Console.WriteLine(averageTemp); Console.WriteLine(maxTemp); Console.WriteLine(minTemp); Console.ReadLine();
- APA:
Dammio. (2017). [LINQ] Phần 10: Các toán tử truy vấn chuẩn trong LINQ 3. https://www.dammio.com/2017/03/17/linq-phan-10-cac-toan-tu-truy-van-chuan-trong-linq-3.
- BibTeX:
@misc{dammio,
author = {Dammio},
title = {[LINQ] Phần 10: Các toán tử truy vấn chuẩn trong LINQ 3},
year = {2017},
url = {https://www.dammio.com/2017/03/17/linq-phan-10-cac-toan-tu-truy-van-chuan-trong-linq-3},
urldate = {2024-12-05}
}
Cảm ơn bạn, bài viết rất hay. Hi vọng bạn sẽ có nhiều bài chất lượng như này nữa 🙂