Kết nối

[LINQ] Phần 10: Các toán tử truy vấn chuẩn trong LINQ 3

25.957 lượt xem 
 Cập nhật lần cuối: 13/04/2017 lúc 18:13:14

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 dựa trên 1 hàm chọn khóa. Phương thức này ép buộc việc thực thi truy vấn.
ToList Chuyển 1 tập thành kiểu List. Phương thức này ép buộc việc thực thi truy vấn. không áp dụng
ToLookup Đặt các phần tử thành Lookup (từ điển 1-nhiều) dựa trên hàm chọn khóa. Phương thức này ép buộc việc thực thi truy vấn. 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();
Liên quan:  [LINQ và chuỗi] Phần 2: Tìm các câu có chứa 1 tập từ vựng cho trước
Trích dẫn bài viết
  • 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}
    }
Theo dõi
Thông báo của
guest
1 Bình luận
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Bôn Đặng
7 năm trước

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 🙂

1
0
Rất thích suy nghĩ của bạn, hãy bình luận.x