1. إيه هو الـ Lambda Expression؟

هو طريقة مختصرة تكتب بيها function صغيرة من غير ما تسميها أو تعرفها بشكل رسمي.
مثلاً: لو عايز تعمل function بتجمع رقمين، تكتبها في سطر واحد بدل ما تعمل method كاملة.
بتتسمى “Anonymous Function” (دالة مجهولة) عشان ملهاش اسم.


2. ليه نستخدمه؟

  • علشان نوفر وقت ونكتب كود أقل.
  • علشان نستخدمه في الحاجات البسيطة اللي مش محتاجة method كاملة (مثلًا: مع الـ LINQ أو الـ Cs Event).
  • علشان الكود يبقى أقرب للطبيعي (مثلًا: x => x * 2 أسهل في القراءة من method كاملة).

3. أنواع Lambda Expressions:

Expression Lambda:

  • بيكون في سطر واحد من غير {}.
  • الصيغة: (inputs) => expression
  • مثال:
Func<int, int> square = x => x * x;  
Console.WriteLine(square(5)); // 25  

Statement Lambda:

  • بيكون فيه أكتر من سطر (محتاج {} و return).
  • الصيغة: (inputs) => { statements; }
  • مثال:
Action<string> greet = name => 
{  
  string message = $"Hello, {name}!";  
  Console.WriteLine(message);  
};  
greet("Salma"); // Hello, Salma!  

4. أمثلة عملية:

مع الـ LINQ

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  
var evenNumbers = numbers.Where(n => n % 2 == 0);  
// Output: 2, 4  

مع الـ Events

Button.Click += (sender, e) => Console.WriteLine("Button Clicked!"); 

مع الـ List.ForEach

List<string> names = new List<string> { "Ali", "Omar", "Hana" };  
names.ForEach(name => Console.WriteLine(name.ToUpper()));  
// Output: ALI, OMAR, HANA  

الـ Sorting:

List<string> words = new List<string> { "apple", "banana", "cherry" };  
words.Sort((a, b) => a.Length.CompareTo(b.Length));  
// Output: "apple", "cherry", "banana"  

الـ Select في LINQ:

var squares = numbers.Select(x => x * x);  
// Output: 1, 4, 9, 16, 25  

5. إزاي بتشتغل مع الـ Cs Delegates؟

الـ Lambda بيتحول تحت الـ hood لـ delegate (مثل Func أو Action).

  • Func:

    Func<int, int, int> add = (a, b) => a + b;  
    Console.WriteLine(add(3, 4)); // 7  
  • Action:

    Action<string> log = message => Console.WriteLine($"Log: {message}");
    log("Error occurred"); // Log: Error occurred  

6. الـ Captured Variables

الـ Lambda ممكن يستخدم variables من بره (الـ outer scope) ويعدل عليها.

int factor = 2;  
Func<int, int> multiplier = n => n * factor;  
Console.WriteLine(multiplier(5)); // 10  
 
factor = 3; // Lambda will use new value  
Console.WriteLine(multiplier(5)); // 15  

Warning:

  • لو الـ variable اتغير بعد ما عملت الـ lambda، النتيجة هتتأثر!
  • ده ممكن يسبب مشاكل في الـ multi-threading لو مش واخد بالك.

7. إيه الـ Limitations؟

  • مينفعش تستخدم ref أو out parameters جوا lambda.
  • لو الـ lambda كبير وكتبته جوا function تانية، ممكن يخلي الـ code أبطأ شوية (لإنه بيعمل capture للـ variables).
  • مينفعش تعمل recursion (استدعاء نفسه) بسهولة.

8. إزاي تكتب lambda كويس؟

  • خليه قصير (متحطش أكتر من 3 أسطر).
  • لو محتاج logic معقد، حوله لـ method عادية.
  • اسم الـ parameters يكون واضح (Like xstudent or age).

9. الفرق بين Lambda و Anonymous Methods:

تطور سينتاكس الـ C# بدأ باستخدام الـ Anonymous Methods، واللي كانت طريقة لعمل Functions من غير تعريف اسم، وكانت شكلها طويل شوية ومش مريح للكتابة.

بعدين ظهر الـ Lambda Expressions اللي قدروا يقللوا الكلام ده ويخلوه أقصر وأسهل في القراءة.

مثال Anonymous Method:

Func<int, int> square = delegate(int x) { return x * x; };

مثال Lambda Expression:

Func<int, int> square = x => x * x;

باختصار: الـ Lambda Expressions هي نسخة مطورة من Anonymous Methods بكتابة أبسط وأسرع، مما بيخلي الكود أنضف وأسهل في التعامل.


الخلاصة:

الـ Lambda Expressions في C# هي سلاح سري علشان تكتب كود أسرع وأوضح، خاصة مع الـ LINQ والـ Events.
”ماتخليهاش تتحول لـ spaghetti code، وخليها زي الفلفل الحار: شوية بتسلي، كتير بتبوظ الأكلة 😅“.