02-08-20, 12:03 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
أردت ان اشرح تعابير لمدا في C# من وجهة نظر التطبيق، وقد يكون الشرح مخل بعض الشيء ولكن الاهم هو ان تصل المعلومة باذن الله سنبدأ بالتعريف ثم نتجه الى التطبيق ان شاء الله .
التعريف :
تعابير Lambda هي عبارة عن اجراء او دالة ليس لها اسم وتعود بقيمة واحدة إذا كانت تمثل دالة او لاتعود باي قيمة اذا كانت تمثل اجراء
يأخذ تعبير لمبدا الشكل العام التالي :
يعني ببساطة كأننا نقول للمترجم للمدخلات التالية كذا وكذا افعل كذا وكذا .
بالنسبة للمدخلات فانها من الممكن ان تكون :
مدخل واحد : التعبير التالي يرجع ضعف الرقم المدخل ، لا حاجة لاستخدام الاقواس () هنا بما انه مدخل واحد :
اكثر من مدخل : التعبير التالي يحسب مجموع ثلاث ارقام مدخلة :
بدون مدخلات :
يمكن استخدام تعبير لمدا بدون مدخلات ، ويستخدم الاقواس الفارغة () للتعبير على انه بدون مدخلات ، التعبير التالي يعيد قيمة ثابتة 2 بدون اي مدخل :
بالنسبة لجسم تعبير لمدا فانه من الممكن ان يتكون من :
سطر واحد : عند صياغة تعبير لمدا في سطر واحد فانه يمكنك كتابة السطر بعد العلامة => مباشرة دول الحاجة للاقواس {}مثل المثال السابق الذي يرجع ضعف الرقم المدخل:
اكثر من سطر : اذا اردت استخدام اكثر من سطر في جسم تعبير لمدا يجب ان تحيطهم باقواس {} ، وكذلك يجب ان تحدد المخرجات يدويا باستخدام Return في حالة ما كان التعبير يمثل دالة طبعا .
التعبير التالي يضيف نقطة في نهاية الكلمة ثم يعرضها في رسالة :
التعبير التالي يقوم بتربيع رقم واعادة النتيجة :
صحيح ان تعبير لمدا لايأخد اسم ولكن يمكنك ان تسنده لكائن من نوع Func<> اذا كان يمثل دالة او Action<> اذا كان يمثل اجراء
ويعامل معاملة الدوال او الاجراءات المعرفة مسبقا ، فعند استدعاء الكائن يقوم باستدعاء تعبير لمدا الذي يشير اليه :
نلاحظ انه يجب عليك تحديد نوع المدخلات والناتج عند استخدام Func<> بين الاقواس <> حيث تعرف نوع المدخلات اولا ثم نوع النتيجة ، والفصل بينهم بالفاصلة العادية , كالمثال الذي في موقع ميكروسوفت ، تعبير لمدا هنا يعيد قيمة bool تمثل اذا كان النص المدخل string اكبر من طول محدد int :
وكذلك الامر بالنسبة ل Action التي تشير الى تعبير لمدا يمثل اجراء لايعود بقيمة :
نلاحظ انه يجب عليك ايضا تحديد نوع المدخلات عند استخدام Action<> بين الاقواس <> والفصل بينهم بالفاصلة العادية ,
وفي حالة ما كان الاجراء لا يأخذ اي مدخلات ، لايتم استخدام اقواس <> وتكتب Action فقط هكذا :
الاجراء السابق يستخدم تعبير لمدا بدون مدخلات يقوم بعرض نسخة جديدة من form1 .
وبما ان تعبير لمدا لايتطلب اسم اصلا فيمكن نظريا تعريف واستدعاء تعبير لمدا في نفس السطر :
هذه كانت نبذة بسيطة عن تعريف تعبير لمدا ، يمكنك ايجاد المزيد هنا :
https://docs.microsoft.com/en-us/dotnet/...nt-lambdas
وهذه مواضيع عن تعبير لمدا ولكنها ل VB.NET
http://vb4arb.com/vb/showthread.php?tid=...ght=lambda
http://vb4arb.com/vb/showthread.php?tid=...ght=lambda
السلام عليكم ورحمة الله وبركاته
أردت ان اشرح تعابير لمدا في C# من وجهة نظر التطبيق، وقد يكون الشرح مخل بعض الشيء ولكن الاهم هو ان تصل المعلومة باذن الله سنبدأ بالتعريف ثم نتجه الى التطبيق ان شاء الله .
التعريف :
تعابير Lambda هي عبارة عن اجراء او دالة ليس لها اسم وتعود بقيمة واحدة إذا كانت تمثل دالة او لاتعود باي قيمة اذا كانت تمثل اجراء
يأخذ تعبير لمبدا الشكل العام التالي :
كود :
(المدخلات) => {جسم التعبير او العمليات على المدخلات}
يعني ببساطة كأننا نقول للمترجم للمدخلات التالية كذا وكذا افعل كذا وكذا .
بالنسبة للمدخلات فانها من الممكن ان تكون :
مدخل واحد : التعبير التالي يرجع ضعف الرقم المدخل ، لا حاجة لاستخدام الاقواس () هنا بما انه مدخل واحد :
كود :
x => x*2
اكثر من مدخل : التعبير التالي يحسب مجموع ثلاث ارقام مدخلة :
كود :
(a, b, c) => a + b + c
بدون مدخلات :
يمكن استخدام تعبير لمدا بدون مدخلات ، ويستخدم الاقواس الفارغة () للتعبير على انه بدون مدخلات ، التعبير التالي يعيد قيمة ثابتة 2 بدون اي مدخل :
كود :
() => 2
بالنسبة لجسم تعبير لمدا فانه من الممكن ان يتكون من :
سطر واحد : عند صياغة تعبير لمدا في سطر واحد فانه يمكنك كتابة السطر بعد العلامة => مباشرة دول الحاجة للاقواس {}مثل المثال السابق الذي يرجع ضعف الرقم المدخل:
كود :
x => x*2
اكثر من سطر : اذا اردت استخدام اكثر من سطر في جسم تعبير لمدا يجب ان تحيطهم باقواس {} ، وكذلك يجب ان تحدد المخرجات يدويا باستخدام Return في حالة ما كان التعبير يمثل دالة طبعا .
التعبير التالي يضيف نقطة في نهاية الكلمة ثم يعرضها في رسالة :
كود :
Action<string> AddToString =
s =>
{
s += ".";
MessageBox.Show(s);
};
التعبير التالي يقوم بتربيع رقم واعادة النتيجة :
كود :
Func<int, int> SquareThis =
x =>
{
x *= x;
return x;
};
صحيح ان تعبير لمدا لايأخد اسم ولكن يمكنك ان تسنده لكائن من نوع Func<> اذا كان يمثل دالة او Action<> اذا كان يمثل اجراء
ويعامل معاملة الدوال او الاجراءات المعرفة مسبقا ، فعند استدعاء الكائن يقوم باستدعاء تعبير لمدا الذي يشير اليه :
كود :
Func<int, int> DoubleThis = x => x * 2;
label1.Text =DoubleThis(3).ToString(); //6
نلاحظ انه يجب عليك تحديد نوع المدخلات والناتج عند استخدام Func<> بين الاقواس <> حيث تعرف نوع المدخلات اولا ثم نوع النتيجة ، والفصل بينهم بالفاصلة العادية , كالمثال الذي في موقع ميكروسوفت ، تعبير لمدا هنا يعيد قيمة bool تمثل اذا كان النص المدخل string اكبر من طول محدد int :
كود :
Func<int, string, bool> isTooLong = ( x, s) => s.Length > x;
وكذلك الامر بالنسبة ل Action التي تشير الى تعبير لمدا يمثل اجراء لايعود بقيمة :
كود :
Action<string> ShowMsgBox = m => MessageBox.Show(m); //تعريف الاجراء
ShowMsgBox("action !"); //استدعاء الاجراء
نلاحظ انه يجب عليك ايضا تحديد نوع المدخلات عند استخدام Action<> بين الاقواس <> والفصل بينهم بالفاصلة العادية ,
وفي حالة ما كان الاجراء لا يأخذ اي مدخلات ، لايتم استخدام اقواس <> وتكتب Action فقط هكذا :
كود :
Action ShowNewForm1 = () => new Form1().Show();
الاجراء السابق يستخدم تعبير لمدا بدون مدخلات يقوم بعرض نسخة جديدة من form1 .
وبما ان تعبير لمدا لايتطلب اسم اصلا فيمكن نظريا تعريف واستدعاء تعبير لمدا في نفس السطر :
كود :
int d = ((Func<int,int>)(x=>x*x))(3);//d=9
هذه كانت نبذة بسيطة عن تعريف تعبير لمدا ، يمكنك ايجاد المزيد هنا :
https://docs.microsoft.com/en-us/dotnet/...nt-lambdas
وهذه مواضيع عن تعبير لمدا ولكنها ل VB.NET
http://vb4arb.com/vb/showthread.php?tid=...ght=lambda
http://vb4arb.com/vb/showthread.php?tid=...ght=lambda
في المشاركة التالية سأعرض استخدامات تعبير لمدا ان شاء الله .