دستورات زیر را در نظر بگیرید
IList<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
bool result = intList.Contains(10); // returns false
در قطعه کد بالا شرط وجود عدد 10 در لیست مورد بررسی قرار گرفته است و تابع Contains بدلیل پیداد نکردن عدد ده در لیست مقدار false را بر میگرداند.
اکنون این تابع را در مجموعه ای از کلاس مورد بررسی قرار می دهیم.
IList<Student> studentList = 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 }
};
Student std = new Student(){ StudentID =3, StudentName = "Bill"};
bool result = studentList.Contains(std); //returns false
همانطور که مشاهده میکنید رکورد مورد نظر در مجموعه وجود دارد اما تابع Contains عبارت false را برمیگرداند. چرا که این تابع در بررسی اشیاء قادر به مقایسه مقادیر آنها نمی باشد لذا برای اینکار باید از اینترفیس IEqualityComparer استفاده نماییم . به قطعه کد زیر دقت نمایید.
class StudentComparer : IEqualityComparer<Student>
{
public bool Equals(Student x, Student y)
{
if (x.StudentID == y.StudentID &&
x.StudentName.ToLower() == y.StudentName.ToLower())
return true;
return false;
}
public int GetHashCode(Student obj)
{
return obj.GetHashCode();
}
}
اینترفیس IEqualityComparer درای دو متد Equals و GetHashCode میباشد که هردوی آنها باید در کلاس مشتق شده پیاده سازی شوند .
هم اکنون شما میتوانید با استفاده از کلاس StudentComparer و متد Equals در برنامه خود استفاده نماید با توجه به قطعه کد زیر.
Student std = new Student(){ StudentID =3, StudentName = "Bill"};
bool result = studentList.Contains(std, new StudentComparer()); //returns true