Take, Skip, TakeWhile, SkipWhile
في متابعة الحديث عن ما يتعلق بتقنية LINQ في هذا الدرس, سنكمل الحديث عن دوال جديدة لها وظائف مفيدة ومساعدة في الاستعلام, فقط اطلب منك عزيزي القارئ التركيز لفكرة عمل هذه الدوال لأنها تتشابه في العمل لكن بطريقة معكوسة... كيف !!
لنبدأ:
أول دالة سوف نتحدث عنها هنا هي دالة الـ Take والمعنى منها بأنك تطلب من الاستعلام بأخذ مجموعة من الأرقام الموجودة في المصفوفة وعرضها لنا
لنرى كيف تعمل هذه الدالة .
Take
int[] Numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var Take = (from r in Numbers
select r).Take(3);
foreach(int Result in Take)
{
Label_Result.Text += Result.ToString() + "<br /> ";
}النتيجة:
5
4
1
How the example work
بكل بساطة استخدمت دالة Take وحددت عدد الـ 3 , اذا سوف نرجع اول 3 اعداد موجودة في المصفوفة سوف نهمل ما تبقى في المصفوفة.
Skip
int[] Numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var Skip = (from r in Numbers
select r).Skip(3);
foreach (int Result in Skip)
{
Label_Result.Text += Result.ToString() + "<br /> ";
}النتيجة:
3
9
8
6
7
2
0
How the example work
بكل بساطة العملية عكس عملية الـ Take حيث في Take نأخد الارقام على حسب عدد الـ count ونهمل ما تبقى من الاعداد الموجودة في المصفوفة,بينما الـ Skip
تهمل الاعداد على حسب الـ count وتأخد ما تبقى من الاعداد ويتم عرضها .
TakeWhile
هذه الدالة تحتاج إلى تركيز لان راح نضيف شيء جديد إلى الاستعلام الخاص بـ LINQ وهو ما يعرف بـ ( Lambda Expressions ) (سوف أضع مصادر في أخر الموضوع لشرح الـ ( Lambda Expressions )
طبعا نرجع إلى دالتنا حيث أنها مثل الـ Take لكن مع شرط وأتوقع من الاسم واضح , مثلا
int[] Numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var TakeWhile = (from r in Numbers
select r).TakeWhile(m => m < 6);
foreach (int Result in TakeWhile)
{
Label_Result.Text += Result.ToString() + "<br />";
}لو بتلاحظ عزيزي القارئ استخدمت الـ Lambda Expression وقلت له الشرط
اخذ الارقام من المصفوفة التي اقل من 6 وكما عملنا سابق في دالة الـ Take لحالها انها تأخذ وتهمل البقية .
النتيجة:
5
4
1
3
How the example work
الطريقة بسيطة طبعا راح ياخذ اول رقم من المصفوفة وهو رقم 5 ويتحقق منه هل هو اصغر من 6 , اكيد نعم راح يرجعة كـ نتيجة للعرض وصولا الى رقم 9 راح ينلغي الشرط , بعدها خلاص الدالة راح توقف عملها .
SkipWhile
اخر دالة لهذا الموضوع هي عكس الدالة السابقة ومشابهة لدالة الـ Skip
بس الفرق الوحيد هنا انها تأتي مع شرط لكن في طريقة اخذ العنصر لا تختلف عن دالة Skip
int[] Numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var SkipWhile = (from r in Numbers
select r).SkipWhile(m => m < 6);
foreach (int Result in SkipWhile)
{
Label_Result.Text += Result.ToString() + "<br />";
}النتيجة:
9
8
6
7
2
0
How the example work
طبا يمكن تتسائل عزيزي القارئ يوجد رقمين اصغر من 6 ( 2 و 0 ) لان مثل ما قلت سابقا الدالة Skip تهمل العناصر السابقة وتأخذ جميع ما تبقى
ملاحظات عامة:
اخواني نستطيع استخدام دالة الـ Take مع دالة الـ Skip في نفس الوقت
int[] Numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var SkipTake = (from r in Numbers
select r).Skip(2).Take(2);
foreach (int Result in SkipTake)
{
Label_Result.Text += Result.ToString() + "<br />";
}How the example work
اتوقع خلاص انها مفهومة بعد شرح كل دالة المفروض بدون تجربة نتوقع الجواب النهائي لهذا المثال , كيفية عمل هذا المثال انه في بداية الامر راح يعمل Skip لعددين وهما 5 و 4 وبعدها بيأخذ عددين وهما 1 , 3
النتيجة:
1
3
مصادر:
Lambda Expressions (C# Programming)
How to: Use Lambda Expressions in a Query (C# Programming Guide)
Lambda Expressions (Visual Basic)
How to: Create a Lambda Expression (Visual Basic)
-------------
اخواني في نهاية الموضوع اتمنى ان شرحي كان بسيط وفي نفس الوقت استطعت ايصال المعلومة بشكل سليم لكم .