عملگر شمارشگر Contains
عملگر Contains در زبان کوئری نویسی LINQ بررسی می کند که آیا یک عنصر خاص در مجموعه وجود دارد یا خیر. در صورت موجود بود true باز میگرداند. متد افزودنی Contains دو overload دارد که در زیر مشاهده می کنید:
1 2 3 4 | public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value); public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer); |
در مثال زیر با استفاده از عملگر Contains بررسی می کنیم که آیا مقدار 10 در مجموعه intList وجود دارد یا خیر:
1 2 | IList<int> intList = new List<int>() { 1, 2, 3, 4, 5 }; bool result = intList.Contains(10); // returns false |
مثال بالا با نوع داده های اولیه به خوبی کار می کند. اما در مورد کلاس های سفارشی این روش کار نمی کند. برای نمونه به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 | 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 |
همانطور که مشاهده می کنید علیرغم وجود دانش آموزی با مشخصات std در لیست نتیجه false شده است. علت این است که متد افزودنی Contains فقط رفرنس اشیاء را بررسی میکند نه مقدار آن ها را. بنابراین برای حل این مشکل می توانید از overload دوم متد Contains استفاده کنید که یک IEqualityComparer را به عنوان ورودی دارد، استفاده کنید. در زیر می توانید چگونگی ساخت مقایسه کننده سفارشی را مشاهده کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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(); } } |
حال می توانیم از مقایسه کننده سفارشی در مثال فوق استفاده کنیم. نتیجه به این صورت خواهد بود:
1 2 3 4 5 6 7 8 9 | 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, new StudentComparer()); //returns true |
توجه! عملگر Contains در سینتکس کوئری پشتیبانی نمی شود.
هیچ نظری ثبت نشده است