المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الثامن والثلاثون : Lambda Expressions دورة .net 2008


khaledbelal
02-25-2010, 02:54 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

كنا قد تحدثنا في موضوع سابق عن Anonymous Methods التي تمكننا من كتابة كود الدالة في مكان استدعاءها ما دمنا لن نستدعيها سوى مرة واحدة فقط ، لنفترض مصفوفة نقوم فيها بالبحث عن الأعداد التي تقبل القسمة على 2 :

C#:

static void TraditionalDelegateSyntax()
{
List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
Predicate<int> callback = new Predicate<int>(IsEvenNumber);
List<int> evenNumbers = list.FindAll(callback);
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}\t", evenNumber);
}

}

static bool IsEvenNumber(int i)
{
return (i % 2) == 0;
}

مع استخدامنا لل Anonymous Methods من C# 2008 اصبح باستطاعتنا كتابتها بالشكل التالي كما تعرف :

C#:

List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });

List<int> evenNumbers = list.FindAll(delegate(int i)
{ return (i % 2) == 0; } );
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}\t", evenNumber);
}
الجديد في .net 2008 هو استخدام ما يعرف باسم Lambda Expressions ، والتي يمكن كتابتها بالشكل التالي :

X => f(X)

لذا ستكون الدالة الخاصة بنا والتي تعيد True في حالة i%2==0 بالشكل التالي :

(int i) => (i % 2) == 0;

حيث ان ال i هي البارميتر ، ونوعه int ، يمكنك حتى الاستغناء عن تعريف نوع البارميتر لإن Lambda سوف تتعرف عليه تلقائياً ، لذا سيكون الكود الكامل بالشكل التالي :
C#:


List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
List<int> evenNumbers = list.FindAll(i => (i % 2) == 0);
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}\t", evenNumber);
}
*** لم استطع تحويل الأكواد إلى vb.net ، لذا اكتفي بأن احيلك لهذا الدرس للأستاذ محمد سامر سلو :
http://vb4arab.com/vb/showthread.php?t=7069

return value :

يمكننا ليس فقط اعادة قيمة واحدة أو true , false فقط ، يمكنك الاطلاع على المثال التالي :


List<int> evenNumbers = list.FindAll((i) =>
{
Console.WriteLine("value of i is currently: {0}", i);
bool isEven = ((i % 2) == 0);
return isEven;
});


ايضاً يمكننا تمرير اكثر من بارميتر ، وذلك حسب الدالة ...