English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
أدت C# 3.0 (.NET 3.5) إلى إدخال تعبيرات Lambda و LINQ. تعبيرات Lambda هي طريقة قصيرة لتمثيل الطرق المجهولة باستخدام بعض النصائح الخاصة.
على سبيل المثال، يمكنك استخدام الطريقة المجهولة التالية لتحقق ما إذا كان الطالب شابًا:
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
Dim isStudentTeenAger = Function(s As Student) As Boolean Return s.Age > 12 And s.Age < 20 End Function
يمكن استخدام تعبيرات Lambda في C# و VB.Net لتمثيل هذه الطريقة المجهولة، كما يلي:
s => s.Age > 12 && s.Age < 20
Function(s) s.Age > 12 And s.Age < 20
لنلقي نظرة على كيفية تحول تعبير Lambda من الطريقة غير المسموح بها التالية.
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
تعبير Lambda هو نتيجة تحول من طريقة غير مسموح بها عن طريق إزالة كلمة المفتاحية للوكيل و نوع المعاملات وإضافة عمودية lambda =>
تعبير Lambda المذكور أعلاه صالح تمامًا، ولكن إذا كان لدينا جملة واحدة فقط للإرجاع، فإننا لا نحتاج إلى الكواشف، و الكلمة المفتاحية return و النقطة المفردة. لذلك يمكننا حذفها.
بالإضافة إلى ذلك، إذا كان لديك معامل واحد فقط، يمكنك حذف الكواشف ()
لذلك، نحصل على تعبير Lambda: s => s.Age > 12 && s.Age < 20 حيثsهو المعامل،=>هو عمودية lambda،s.Age > 12 && s.Age < 20هو جسم التعبير:
يمكننا كتابة طريقة الحصول على تعبير Lambda في VB.Net كما يلي:
يتم استدعاء تعبير Lambda بنفس الطريقة التي يتم بها استدعاء الوكيل باستخدام ()
ملاحظة: لا يدعم VB.Net عمودية lambda =>
إذا كنت بحاجة إلى نقل عدة معاملات، يمكنك وضع المعاملات داخل الكواشف، مثلما يلي:
مثال: تحديد عدة معاملات في تعبير Lambda C#
(s, youngAge) => s.Age >= youngage;
إذا شعرت أن تعبير المعاملات غير واضح، يمكنك أيضًا تقديم نوع كل معاملاتها:
(Student s, int youngAge) => s.Age >= youngage;مثال: تحديد عدة معاملات في تعبير Lambda VB.Net
Function(s, youngAge) s.Age >= youngAge
ليس من الضروري أن تحتوي تعبير Lambda على معاملات على الأقل. يمكن أن تكون تعبير Lambda بدون أي معاملات أيضًا.
() => Console.WriteLine("عبرة lambda بدون أي معاملات")
إذا كنت ترغب في تضمين عدة جمل في الجسم، يمكنك استخدام الكواشف الكبيرة [] لتقديم التعبير:
(s, youngAge) =>{ Console.WriteLine("تعبير Lambda يحتوي على عدة جمل في الجسم"); Return s.Age >= youngAge;}
Function(s, youngAge) Console.WriteLine("تعبير Lambda يحتوي على عدة جمل في الجسم"); Return s.Age >= youngAge End Function
يمكنك إعلان متغيرًا في جسم التعبير، واستخدامه في أي مكان داخل جسم التعبير، مثلما يلي:
s => { int youngAge = 18; Console.WriteLine("تعبير Lambda يحتوي على عدة جمل في الجسم"); return s.Age >= youngAge; }
Function(s) Dim youngAge As Integer = 18 Console.WriteLine("تعبير Lambda يحتوي على عدة جمل في الجسم"); Return s.Age >= youngAge End Function
يمكن أيضًا تعيين تعبير Lambda إلى وسيط مدمج، مثل Func،Action وPredicate.
يمكنك تعيين تعبير Lambda إلى نوع وسيط Func<in T, out TResult>. نوع آخر للمعلمة في وسيط Func هو نوع العودة، بينما تكون البقية هي المعلمات المدخلة.زيارة جزء وسيط Func في تعليمات C# للحصول على معلومات إضافية.
خذ في الاعتبار تعبير Lambda التالي لفهم ما إذا كان الطالب صغيرًا.
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; Student std = new Student() { age = 21 }; bool isTeen = isStudentTeenAger(std); // عودة false
Dim isStudentTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20 Dim stud As New Student With {.Age = 21} Dim isTeen As Boolean = isStudentTeenAger(stud) // عودة false
في المثال السابق، يتوقع وكيل العمل Func أن يكون أول معامل إدخال من نوع Student وأن يكون نوع العودة نوع布尔ية. يرضي تعبير lambda s => s.age > 12 && s.age < 20 متطلبات وكيل العمل Func<Student, bool>، كما هو موضح أدناه:
سيصبح وكيل العمل Func <> الذي تم عرضه أعلاه في وظيفة كما يلي.
bool isStudentTeenAger(Student s) { return s.Age > 12 && s.Age < 20; }
مختلف عن وكيل العمل Funcوكيل العمل Actionيمكن أن يكون له فقط معاملات إدخال. عند عدم الحاجة إلى إرجاع أي قيمة من تعبير lambda، استخدم وكيل العمل Action.
Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age); Student std = new Student() { StudentName = "Bill", Age = 21 }; PrintStudentDetail(std)//يتم إدخال: Name: Bill, Age: 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age) Dim stud As New Student With {.StudentName = "Bill", .Age = 21} printStudentDetail(stud)//يتم إدخال: Name: Bill, Age: 21
عادةً ما يستخدم تعبير lambda مع استعلامات LINQ. تشمل الفئات الثابتة القابلة للجمع التجميعات التوسعية الخاصة بها طريقة Where() التي تأخذ Func<TSource, bool>. لذلك، يجب استخدام تعبير Where() التوسعية الخاصة بIEnumerable<Student> عبر Func<Student, bool>، كما هو موضح أدناه:
لذلك، الآن، يمكنك استخدام طريقة طلب Where() كما هو موضح في طريقة الطريقة الموسعة:
IList<Student> studentList = new List<Student>(){...}; Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();
IList<Student> studentList = new List<Student>(){...}; Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20; var teenStudents = from s in studentList where isStudentTeenAger(s) select s;
يمكنك اتباع نفس الطريقة في VB.Net لتحويل Delegation.
Lambda Expression هي طريقة مختصرة لتمثيل الطرق المجهولة.
نحو Lambda Expression: المعلمات => جسم التعبير
يمكن أن يكون لدي Lambda Expression بدون معلمات.
يمكن أن تحتوي أقواس Lambda () على عدة معلمات.
يمكن أن تحتوي Lambda Expression على عدة جمل في جسم التعبير بين البكارات {}.
يمكن تخصيص Lambda Expression لـ Func،Action أو Predicate Delegation.
يمكنك طلب Lambda Expression بطريقة مشابهة لـ Delegation.