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
x
→student
orage
).
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، وخليها زي الفلفل الحار: شوية بتسلي، كتير بتبوظ الأكلة 😅“.