1
00:00.110 --> 00:00.830
دوباره خوش آمدید.

2
00:00.830 --> 00:03.260
در این ویدیو قراره به **lambda expressions** نگاه کنیم.

3
00:03.260 --> 00:11.480
و بعد اون به ما کمک می‌کنه تا **predicates** رو درک کنیم که بعد به ما کمک می‌کنه تا بفهمیم چطور از **FindAll** یا **Any** یا...

4
00:11.480 --> 00:20.180
متدهای خیلی زیاد دیگه‌ای که در **C#** روی **list**ها قابل اجرا هستن و نیاز به پاس دادن **lambda** دارن، استفاده کنیم.

5
00:20.180 --> 00:22.220
پس درک این موضوع واقعاً مهمه.

6
00:22.220 --> 00:25.460
پس یک **lambda expression** از دو بخش تشکیل شده.

7
00:25.460 --> 00:30.620
شماره یک **parameters** (پارامترها) هستن و شماره دو **expression** (عبارت) یا **statement block** (بلوک دستور).

8
00:30.740 --> 00:33.950
و در سمت چپ **parameters** قرار دارند.

9
00:33.950 --> 00:37.790
و بعد در سمت چپ این علامت اینجا. یعنی مساوی بزرگتر از.

10
00:37.790 --> 00:42.200
راستی، این نماد به صورت **"می‌رود به"** یا **"تبدیل می‌شود به"** خوانده می‌شود.

11
00:42.200 --> 00:46.460
پس **expression** یا عملی که باید انجام بشه، در سمت راست قرار داره.

12
00:46.460 --> 00:53.480
پس اینجا این مثال رو داریم: **x** علامت مساوی بزرگتر از **x** ضربدر **x** نقطه ویرگول.

13
00:53.480 --> 00:56.180
و اینطور خوانده می‌شود:

14
00:56.180 --> 01:02.990
"یک ورودی **x** رو بگیر و اون رو به **x** ضربدر **x** تبدیل کن"، اوکی؟

15
01:02.990 --> 01:07.610
پس **x** می‌رود به یا تبدیل می‌شود به **x** ضربدر **x**.

16
01:07.610 --> 01:15.110
پس اگه این خط بسیار ساده رو بگیریم و بخوایم ازش یک **method** بسازیم، به این شکل خواهد بود.

17
01:15.110 --> 01:16.580
داریم بهش می‌گیم **squaring** (به توان رساندن).

18
01:16.580 --> 01:21.380
داریم یک **parameter** می‌گیریم و فقط می‌گیم **parameter** ضربدر **parameter** رو **return** کن.

19
01:21.380 --> 01:23.720
پس **x** ضربدر **x** در این مورد، درسته؟

20
01:23.720 --> 01:26.150
یا **num1** ضربدر **num1** در این مورد.

21
01:26.150 --> 01:27.950
پس می‌تونستیم اون رو **x** هم بنامیم.

22
01:27.950 --> 01:30.020
اما در نهایت زیاد مهم نیست.

23
01:30.020 --> 01:37.370
اما ایده اینجا اینه که این با این یکیه، حداقل زمانی که اون رو مستقیماً اجرا می‌کنید.

24
01:37.370 --> 01:44.450
پس یک **lambda expression** فقط یک راه بسیار کوتاه برای ایجاد یک **method** هست که هرگز فراخوانی نمی‌شه...

25
01:44.450 --> 01:57.620
خارج از لحظه‌ای که داره استفاده می‌شه، چون ما نمی‌تونیم از این **lambda** استفاده کنیم یا بهش یک اسم بدیم و بعداً ازش استفاده کنیم، چون اگه بخوایم چندین بار ازش استفاده کنیم، باید از یک **method** برای اون استفاده کنیم.

26
01:57.620 --> 02:09.470
اما **lambda** به ما اجازه می‌ده که نتایج رو خیلی سریع به دست بیاریم بدون اینکه مجبور باشیم یک **method** جداگانه ایجاد کنیم که به هر حال فقط یک بار فراخوانی می‌شه، مثلاً، و می‌تونیم فقط منطق رو خیلی سریع و...

27
02:09.470 --> 02:13.190
خیلی دقیق در فقط یک خط کوتاه کد داشته باشیم.

28
02:13.190 --> 02:17.900
پس گاهی اوقات شما فقط نیازی به نوشتن یک **method** جداگانه ندارید، و **lambda expression** به اندازه کافی خوبه.

29
02:17.900 --> 02:23.690
و تا حدودی خوندنش خیلی آسونه چون می‌تونید ببینید کد مستقیماً چه کاری انجام می‌ده.

30
02:23.690 --> 02:30.050
پس اگه واضحاً یک **method** خیلی پیچیده دارید که می‌خواید اجرا کنید، **lambda expression** راه درستی برای رفتن نیست.

31
02:30.050 --> 02:33.440
اما در این مورد، یک **expression** بسیار ساده هست که می‌خوایم به دست بیاریم.

32
02:33.440 --> 02:40.310
ما فقط می‌خوایم به دست بیاریم که هر ورودی که بهش می‌دیم، می‌خوایم ضرب دو تا رو به ما بده.

33
02:40.310 --> 02:44.480
حالا چطور می‌تونیم این اصل رو روی **list**های خودمون اعمال کنیم؟

34
02:44.480 --> 02:46.400
خب، قبلاً این کار رو کردیم.

35
02:46.400 --> 02:54.290
پس چیزی که اینجا گفتیم اینه که گفتیم **x** تبدیل می‌شود به **x** بزرگتر مساوی **10**.

36
02:54.290 --> 03:01.280
پس نتیجه این کد هر چه که باشه، هر چیزی که این **return** کنه، اون چیزیه که **x** بهش تبدیل می‌شه.

37
03:01.280 --> 03:09.650
پس حالا ممکنه بگید خب این کمی گیج‌کننده‌ست چون ما علامت مساوی بزرگتر از رو داریم و بعد علامت بزرگتر از مساوی رو داریم.

38
03:09.650 --> 03:13.910
خب قضیه اینه که این اینجا یک **lambda** هست.

39
03:13.910 --> 03:15.620
می‌تونید ببینید وقتی نشانگر رو روش نگه می‌دارید.

40
03:15.620 --> 03:17.780
این یک **lambda expression** هست.

41
03:17.780 --> 03:22.220
پس این بخش کلیدی یک **lambda expression** هست.

42
03:22.220 --> 03:26.540
شما باید علامت مساوی بزرگتر از رو برای یک **lambda expression** داشته باشید.

43
03:26.540 --> 03:32.150
با این حال اگه می‌خواید از علامت بزرگتر مساوی استفاده کنید، اون یک عملیات **Boolean** هست.

44
03:32.150 --> 03:34.460
پس می‌بینید اینجا اون رو مقایسه می‌کنه.

45
03:34.460 --> 03:40.430
پس اگه می‌خواستید کوچکتر مساوی رو انجام بدید، می‌تونید اون رو به این شکل انجام بدید.

46
03:40.430 --> 03:44.690
اما هرگز نمی‌تونید بگید مساوی کوچکتر از یا مساوی بزرگتر از، اوکی؟

47
03:44.690 --> 03:45.980
پس اون کار نمی‌کنه.

48
03:45.980 --> 03:51.200
پس اون همیشه یک **lambda expression** خواهد بود، همونطور که می‌بینید علامت مساوی بزرگتر از.

49
03:51.200 --> 04:01.310
این در **C#** یا در بیشتر زبان‌های برنامه‌نویسی به عنوان دو کاراکتری تعریف شده که نشون می‌ده ما اینجا داریم در مورد یک **lambda expression** صحبت می‌کنیم.

50
04:01.310 --> 04:07.520
خب چطور می‌تونستیم هر چیزی که اینجاست رو داخل یک متغیر ذخیره کنیم؟

51
04:07.520 --> 04:09.530
بنابراین، می‌تونستیم از یک **predicate** استفاده کنیم.

52
04:09.530 --> 04:11.270
و من قبلاً در مورد این کلمه کلیدی صحبت کردم.

53
04:11.270 --> 04:11.660
درسته.

54
04:11.660 --> 04:16.610
پس کاری که می‌تونیم انجام بدیم اینه که جلو بریم و از کلمه کلیدی **predicate** استفاده کنیم.

55
04:16.610 --> 04:17.990
می‌تونید ببینید اینجاست.

56
04:17.990 --> 04:22.850
این **predicate** به ما اجازه می‌ده، خب باید تعریف کنیم از چه نوعی هست.

57
04:22.850 --> 04:27.320
این به ما اجازه می‌ده که ذخیره کنیم آیا چیزی بزرگتر هست یا نه.

58
04:27.320 --> 04:31.820
پس می‌تونیم فقط بگیم **isGreaterThanTen** (بزرگتر از ده است)، مثلاً.

59
04:31.820 --> 04:35.600
و بعد می‌تونیم یک **lambda expression** رو به اون اختصاص بدیم.

60
04:35.600 --> 04:41.630
پس اینجا می‌تونم فقط جلو برم و این **lambda expression** خاص رو به این شکل به اون اختصاص بدم.

61
04:41.630 --> 04:48.320
پس کاری که این انجام می‌ده اینه که **predicate** رو تعریف می‌کنه تا چک کنه آیا یک عدد بزرگتر از ده هست یا نه، به این شکل.

62
04:48.860 --> 04:56.690
پس **predicate** از نوع **int** که **isGreaterThanTen** هست، نتیجه هر چیزی که اینجاست رو نگه خواهد داشت.

63
04:56.690 --> 04:59.790
و همینجا می‌گه وقتی نشانگر رو روش نگه می‌دارید: "ما...

64
04:59.790 --> 05:05.820
نشان‌دهنده **method**ی هست که مجموعه‌ای از معیارها رو تعریف می‌کنه و مشخص می‌کنه که آیا **object** مشخص شده اون معیارها رو برآورده می‌کنه یا نه،

65
05:05.820 --> 05:15.210
و اگه **object** معیارهای تعریف شده در **method** که توسط این **delegate** نمایش داده می‌شه رو برآورده کنه، **true** برمی‌گردونه و در غیر این صورت **false**."

66
05:15.210 --> 05:22.350
پس هر چیزی که ما اینجا پاس دادیم، اون رو داخل اون **isGreaterThan** **predicate** ذخیره خواهد کرد.

67
05:22.350 --> 05:28.170
و بعد می‌تونیم از اون **isGreaterThan** **predicate** داخل **FindAll** **method** خودمون استفاده کنیم.

68
05:28.170 --> 05:37.080
پس حالا داریم این دو مفهوم رو کنار هم میاریم که داریم از یک **lambda expression** استفاده می‌کنیم تا اون رو داخل یک **predicate** ذخیره کنیم، اوکی؟ و به این شکل.

69
05:37.080 --> 05:44.400
می‌تونید کل مطلب رو بخونید که می‌گه توسط این **delegate** نمایش داده می‌شه، در غیر این صورت **false**.

70
05:44.400 --> 05:50.250
حالا درک اینکه **delegate** چیه کمک می‌کنه، اما فعلاً باید بگم که بعداً اون رو پوشش خواهیم داد.

71
05:50.250 --> 05:56.490
پس لطفاً در مورد اون جنبه خاص از زبان برنامه‌نویسی **C#** صبور باشید.

72
05:56.490 --> 06:05.660
می‌بینید، ما داریم همین حالا هم کاملاً عمیق وارد زبان می‌شیم، و این شما رو واقعاً برای هر چیزی که ممکنه سر راهتون قرار بگیره، آماده می‌کنه.

73
06:05.660 --> 06:10.400
راستی، اینجا دارم می‌گم بزرگتر از یا مساوی. اوکی.

74
06:10.400 --> 06:15.080
پس حالا جایگزین این خواهد بود که فقط از شر این علامت مساوی خلاص بشیم.

75
06:15.080 --> 06:19.850
پس حالا فقط اعدادی که بزرگتر از **10** هستن بخشی از اون خواهند بود، اوکی؟

76
06:19.850 --> 06:27.980
حالا این **list** اینجا **higherEqualTen** حالا **higherTen** نامیده می‌شه، اوکی؟

77
06:27.980 --> 06:30.740
پس من فقط قراره ازش به این شکل استفاده کنم.

78
06:30.740 --> 06:36.350
و حالا چیزی که خواهیم داشت تمام اعدادی هست که بزرگتر از **10** هستن، **10** مستثنی می‌شه، اوکی؟

79
06:36.350 --> 06:43.880
پس اگه این رو اجرا کنید خواهید دید **"all numbers ten and higher in our list"**: **15، 25 و 18**، اوکی؟

80
06:43.880 --> 06:45.950
پس حالا خیلی چیزها کنار هم قرار گرفت.

81
06:45.950 --> 06:50.390
ما **predicate** خودمون رو داشتیم و **lambda expression** رو داشتیم.

82
06:50.390 --> 06:52.670
حالا مدیریت این کمی سخته.

83
06:52.670 --> 06:56.810
پس بیایید جلو بریم و چند مثال دیگه در ویدیوهای بعدی داشته باشیم.