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.
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:
- 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.
- 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.
- 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.