تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
شرح مبسط - Lambda Expressions
#3
اشيع استخدام لتعبيرات لامدا هو تمرير الدالة كوسيط من النوع Delegate
اعرف ان الكلام غامض بعض الشيئ ؟؟ لكن اذا كنت قد تعاملت مع Delegate سابقاً يمكنك فهمها بشكل بسيط

لناخذ مثال على ذلك 
لنفرض انه طلب منا ان نقوم بمعرفة العمليات التي يتم تشغيلها و التي تمتلك Thread واحد فقط
يوجد عدد من الحلول لمثل هذا السؤال كما يلي
PHP كود :
Dim filteredQuery From proc In Diagnostics.Process.GetProcesses
                        Where proc
.Threads.Count 1
                        Select proc

    For Each proc In filteredQuery
        MsgBox
(proc.ProcessName)
Next 
كود بسيط يستخدم Linq يقوم بتحديد العملية التي توافق الشرط من المصفوفة ويضعها في Enumerable
ثم نقوم بالمرور على عناصر التعداد و نعرض اسم العملية

الان لو فكرنا قليلاً كيف يمكن ان نستفيد من Lambd في مثل هذا الامر
اولاً يمكنني الحصول على العمليات في مصفوفة من النوع Process
ومن ثم يمكنني استخدام الطرق الموسعة داخل المصفوفات و التي تحتوي على دوال جاهزة تقبل بداخلها بارمترات من النوع Lambda
عبارة Where السابقة في استعلام Linq يمكنني العثور عليها كدالة تعمل مع المصفوفات
و تحتاج الى بارميتر من النوع Func و تعيد قيمة منطقية
ليتضح الامر اكثر
PHP كود :
       Dim procList As Process() = Diagnostics.Process.GetProcesses

        Dim filteredList 
procList.Where(Function(pp.Threads.Count 1)

 
       For Each proc In filteredList
            MsgBox
(proc.ProcessName)
 
       Next 
في السطر الثاني من الكود و تحديداً الدالة Where سترى انها تطبق على المصفوفات من النوع IEnumerable(of TSource) k  و التي بدورها مشتقة من النوع Generic(of TSource) p   و تعيد النوع  IEnumerable(of TSource) p                 
لا تهتم كثيراً بهذا الكلام , و لكن دقق ان الدالة تحتاج الى وسيط من النوع Function يعيد قيمة منطقية
ولاحظ اننا مررنا دالة Lambda مع بارميتر (البارميتر هنا هو Process) و عمل الدالة هو تحديد Process يمتلك Thread واحد فقط
و بالتالي اذا تحقق الشرط ستعود الدالة بقيمة True و بالتالي ستضاف Process الى التعداد filteredList
و اخيراً قمنا بالمرور على العناصر داخل التعداد و عرض اسم العملية


بالنسبة للدوال التوسعية او الاضافية (Extention Methods) التي يمكنك جعلها تتوفر مع كائن ما بشكل افتراضي , ليس لدي الوقت الكثير لادخل في شرحها
لكن ولانني قد اشرت سابقاً لها في احد الاجوبة هنا تحديداً  يمكنك مراجعة الرابط لفهم جزئي لها

يبدو الامر فيه بعض الصعوبة مبدئياً و لكن مع الوقت و التعود على استخدامها ستكتشف مدى قوتها.



مفهوم الـ  asynchronous 
بالعربي تلفظ (اسنكرونس)  Shy  لفظها ثقيل

وعكسها synchronous (سنكرونس) متزامن
مفهوم عدم التزامن مفهوم منفصل عن هذا الموضوع و يحتاج الى شرح منفصل 
ولكن ولكي نغطي هذا الجزء مع الدوال و الاجراءات بشكل عام يمكننا شرحه بشكل مبسط وفق وروده في الاكواد

ترتبط العمليات غير المتزامنة بكلمتين مفتاحيتين هم Async  و  Await
و لجعل دالة ما او اجراء من النوع غير المتزامن يمكنك اضافة الكلمة Async قبل الدالة او الاجراء و من ثم تحتاج الى الكلمة Await في قلب الدالة, و التي بدورها تؤجل تنفيذ الكود الى ان يتم تنفيذ مهمة معينة او حتى يمكن ان تكون فاصل زمني محدد
مثال على ذلك
PHP كود :
   Private Async Sub Button1_Click(sender As ObjectAs EventArgsHandles Button1.Click
        Await ExampleMethodAsync
()
 
       TextBox1.Text "Task Completed..."
 
   End Sub

    Async 
Function ExampleMethodAsync() As Task
        Await Task
.Delay(3000)
 
   End Function 
لن يتم ملئ TextBox1 الى بعد 3 ثواني , طبعاً هذا المثال للتوضيح وهو غير مرتبط بموضوعنا هنا و ليصبح اكثر ارتباط انظر الى الكود التالي
حاول ان تضع الكود في حدث Form_Load
PHP كود :
       AddHandler Button1.Click,
 
           Async Sub(sender1e1)
 
               Await ExampleMethodAsync()
 
               TextBox1.Text vbCrLf "Task Completed..."
 
           End Sub 
هل اتضحت لك الصورة الان , ربطنا حدث Click الخاص بالزر بالاجراء ExampleMethodAsync تلقائياً مع بداية اقلاع النموذج ولم نعد بحاجة لمعالجة حدث الضغط (Click) بشكل منفصل

لم ينتهي الحديث عن Lambda و هناك الكثير الكثير عنه و يحتاج شرحه و التعمق فيه الى الكثير من الوقت و الجهد
و اتمنى ان اكون قد انرت شمعة لمن يجهل هذا الاسلوب او لمن يحتاج الى معلومات بسيطة عنه
اترك الباقي للمهتمين بالتوسع و اثراء الموضوع بمعرفتهم .

(25-05-17, 11:00 PM)Amir_alzubidy كتب : و عليكم السلام و رحمة الله
و كل عام و انتم بخير و جميع المسلمين ان شاء الله .
ما شاء الله تبارك الرحمن
يعجبني الاسلوب، و التسلسل و الفن في ايصال المعلومة.
الله يعطيك العافية و يزيدك علم و يرزقك . اللهم آمين
شكرا على دعواتك اخي امير و بارك الله فيك و زادك من نعمه
(26-05-17, 12:02 AM)Fantastico كتب : موضوع قيم ومهم
جزاك الله خير
جزاك الله بالمثل اخي الكريم
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: Fantastico , Amir_Alzubidy


الردود في هذا الموضوع
شرح مبسط - Lambda Expressions - بواسطة ابو ليلى - 25-05-17, 06:57 PM
RE: شرح مبسط - Lambda Expressions - بواسطة Fantastico - 26-05-17, 12:02 AM
RE: شرح مبسط - Lambda Expressions - بواسطة ابو ليلى - 26-05-17, 01:30 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Lightbulb [VB.NET] درس مبسط في الاتصال بقاعدة بيانات SQL Bin-Komet 3 3,568 23-10-17, 09:34 AM
آخر رد: مصمم هاوي
  [مقال] مفهوم Generics بشكل مبسط ابو ليلى 3 2,701 26-05-17, 12:18 AM
آخر رد: Fantastico
  معلومة ::: Regular Expressions RaggiTech 6 3,084 06-10-12, 09:06 PM
آخر رد: RaggiTech
  Lambda Expressions من جديد VB2008 RaggiTech 0 2,401 01-10-12, 05:59 PM
آخر رد: RaggiTech
  (الدرس الثالث - الجزء 1 ) = امر التكرار والدوران for ... next مبسط RaggiTech 0 2,936 01-10-12, 03:11 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم