Toán tử so sánh bằng trong LINQ

Chỉ có một toán tử so sánh bằng trong LINQ là SequenceEqual. Toán tử so sánh bằng là một trong những toán tử truy vấn chuẩn của LINQ.

Toán tử truy vấn chuẩn của LINQ | Comdy
Các toán tử truy vấn chuẩn trong LINQ là các phương thức mở rộng cho các kiểu IEnumerable<T> và IQueryable<T>.

Phương thức SequenceEqual trong LINQ

Phương thức SequenceEqual kiểm tra xem số lượng phần tử, giá trị của từng phần tử và thứ tự các phần tử trong hai danh sách có giống nhau hay không.

Nếu danh sách chứa các phần tử của các kiểu dữ liệu nguyên thủy thì nó sẽ so sánh các giá trị, số lượng và thứ tự các phần tử.

Ví dụ sau đây minh họa sử dụng phương thức SequenceEqual với danh sách có kiểu dữ liệu nguyên thủy.


IList<string> strList1 = new List<string>() { "One", "Two", "Three", "Four", "Three" };

IList<string> strList2 = new List<string>() { "One", "Two", "Three", "Four", "Three" };

bool isEqual = strList1.SequenceEqual(strList2); 
Console.WriteLine(isEqual);

Đây là kết quả khi biên dịch và thực thi chương trình:

true

Nếu thứ tự của các phần tử không giống nhau thì phương thức SequenceEqual trả về false.


IList<string> strList1 = new List<string>() { "Two", "One", "Three", "Four", "Three" };

IList<string> strList2 = new List<string>() { "One", "Two", "Three", "Four", "Three" };

bool isEqual = strList1.SequenceEqual(strList2); 
Console.WriteLine(isEqual);

Đây là kết quả khi biên dịch và thực thi chương trình:

false

Phương thức mở rộng SequenceEqual không so sánh giá trị của các đối tượng kiểu phức tạp mà nó kiểm tra tham chiếu của các đối tượng.

Nếu các đối tượng có cùng tham chiếu thì chúng được coi là bằng nhau nếu không chúng được coi là không bằng nhau.

Vì vậy, phương thức mở rộng SequenceEqual sẽ không làm việc chính xác trên danh sách kiểu phức tạp.

Do đó, bạn cần triển khai interface IEqualityComparer<T> để so sánh giá trị của các kiểu phức tạp.

Trong ví dụ sau, lớp StudentComparer triển khai interface IEqualityComparer<Student> để so sánh các đối tượng Student trong danh sách.

public class Student 
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int Age { get; set; }
}

class StudentComparer : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        return x.StudentID == y.StudentID &&
            x.StudentName.ToLower() == y.StudentName.ToLower();
    }

    public int GetHashCode(Student obj)
    {
        return obj.StudentID.GetHashCode();
    }
}

Bây giờ, bạn có thể truyền một đối tượng của lớp StudentComparer trên làm tham số trong phương thức SequenceEqual để so sánh các đối tượng Student như dưới đây.

Ví dụ dưới đây minh họa sử dụng lớp StudentComparer làm đối số cho phương thức SequenceEqual trong LINQ:

IList<Student> studentList1 = new List<Student>() 
{ 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 },
    new Student() { StudentID = 2, StudentName = "Steve", Age = 15 },
    new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
    new Student() { StudentID = 4, StudentName = "Ram", Age = 20 },
    new Student() { StudentID = 5, StudentName = "Ron", Age = 19 } 
};

IList<Student> studentList2 = new List<Student>() 
{ 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 },
    new Student() { StudentID = 2, StudentName = "Steve", Age = 15 },
    new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
    new Student() { StudentID = 4, StudentName = "Ram", Age = 20 },
    new Student() { StudentID = 5, StudentName = "Ron", Age = 19 } 
};

bool isEqual = studentList1.SequenceEqual(studentList2, new StudentComparer());
Console.WriteLine(isEqual);

Đây là kết quả khi biên dịch và thực thi chương trình:

true
Lưu ý: Phương thức mở rộng SequenceEqual không hỗ trợ  cú pháp truy vấn trong LINQ.

Những điểm cần nhớ về phương thức SequenceEqual trong LINQ:

  1. Phương thức SequenceEqual so sánh số lượng phần tử và giá trị của chúng cho các kiểu dữ liệu nguyên thủy.
  2. Phương thức SequenceEqual so sánh tham chiếu của các đối tượng cho các kiểu dữ liệu phức tạp.
  3. Sử dụng lớp triển khai interface IEqualityComparer để so sánh hai phần của kiểu dữ liệu phức tạp bằng phương thức SequenceEqual.


Bài viết liên quan:

Bạn sẽ tìm hiểu một số truy vấn LINQ phức tạp trong hướng dẫn này.

Từ khóa let, into trong LINQ có tác dụng gì? Hướng dẫn khai báo và sử dụng từ khóa let, into trong LINQ.

Trì hoãn thực thi truy vấn LINQ là gì? Thực thi ngay lập tức truy vấn LINQ là gì? Làm sao để thực thi truy vấn LINQ.