English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعبيرات Lambda لـ LINQ

أدت 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 من الطريقة غير المسموح بها

تعبير Lambda المذكور أعلاه صالح تمامًا، ولكن إذا كان لدينا جملة واحدة فقط للإرجاع، فإننا لا نحتاج إلى الكواشف، و الكلمة المفتاحية return و النقطة المفردة. لذلك يمكننا حذفها.

بالإضافة إلى ذلك، إذا كان لديك معامل واحد فقط، يمكنك حذف الكواشف ()

تعبير Lambda من الطريقة غير المسموح بها

لذلك، نحصل على تعبير Lambda: s => s.Age > 12 && s.Age < 20 حيثsهو المعامل،=>هو عمودية lambda،s.Age > 12 && s.Age < 20هو جسم التعبير:

هيكل تعبير Lambda في C#

يمكننا كتابة طريقة الحصول على تعبير Lambda في VB.Net كما يلي:

هيكل تعبير Lambda في VB.Net

يتم استدعاء تعبير Lambda بنفس الطريقة التي يتم بها استدعاء الوكيل باستخدام ()

ملاحظة: لا يدعم VB.Net عمودية lambda =>

تعبير 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 على معاملات على الأقل. يمكن أن تكون تعبير Lambda بدون أي معاملات أيضًا.

() => Console.WriteLine("عبرة lambda بدون أي معاملات")

جمل Lambda في جسم Lambda

إذا كنت ترغب في تضمين عدة جمل في الجسم، يمكنك استخدام الكواشف الكبيرة [] لتقديم التعبير:

(s, youngAge) =>{
  Console.WriteLine("تعبير Lambda يحتوي على عدة جمل في الجسم");
    
  Return s.Age >= youngAge;}
Function(s, youngAge)
    
    Console.WriteLine("تعبير Lambda يحتوي على عدة جمل في الجسم");
    
    Return s.Age >= youngAge
End Function

إعلان متغيرات محلية في جسم تعبير Lambda

يمكنك إعلان متغيرًا في جسم التعبير، واستخدامه في أي مكان داخل جسم التعبير، مثلما يلي:

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 إلى وسيط

يمكنك تعيين تعبير 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 مع تعبير lambda

سيصبح وكيل العمل Func <> الذي تم عرضه أعلاه في وظيفة كما يلي.

bool isStudentTeenAger(Student s)
{
    return s.Age > 12 && s.Age < 20;
}

وكيل العمل Action

مختلف عن وكيل العمل 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

عادةً ما يستخدم تعبير lambda مع استعلامات LINQ. تشمل الفئات الثابتة القابلة للجمع التجميعات التوسعية الخاصة بها طريقة Where() التي تأخذ Func<TSource, bool>. لذلك، يجب استخدام تعبير Where() التوسعية الخاصة بIEnumerable<Student> عبر Func<Student, bool>، كما هو موضح أدناه:

معلمات Delegation في طريقة Where الموسعة

لذلك، الآن، يمكنك استخدام طريقة طلب 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.

نقاط يجب تذكرها

  1. Lambda Expression هي طريقة مختصرة لتمثيل الطرق المجهولة.

  2. نحو Lambda Expression: المعلمات => جسم التعبير

  3. يمكن أن يكون لدي Lambda Expression بدون معلمات.

  4. يمكن أن تحتوي أقواس Lambda () على عدة معلمات.

  5. يمكن أن تحتوي Lambda Expression على عدة جمل في جسم التعبير بين البكارات {}.

  6. يمكن تخصيص Lambda Expression لـ Func،Action أو Predicate Delegation.

  7. يمكنك طلب Lambda Expression بطريقة مشابهة لـ Delegation.