1
00:00.140 --> 00:07.160
بسیار خب، پس تصمیم گرفتم ایده کلی اینکه **delegate** چیه رو به شما نشون بدم.

2
00:07.160 --> 00:17.960
اوکی، ما **delegates** رو بعداً با جزئیات بیشتری پوشش خواهیم داد چون وقتی صحبت از **events** (رویدادها) می‌شه، بسیار مهم هستن، و این وقتی صحبت از **graphical user interfaces** (رابط‌های کاربری گرافیکی) می‌شه، خیلی مهمه.

3
00:17.960 --> 00:23.720
پس بیایید در یک سطح فوق‌العاده بالا ببینیم **delegate** چیه، اوکی.

4
00:23.720 --> 00:29.330
پس در **C#**، یک **delegate** مثل یک **pointer** یا **reference** به یک **method** هست.

5
00:29.330 --> 00:36.500
این به شما اجازه می‌ده که **methods** رو به عنوان **arguments** به **methods** دیگه پاس بدید، اون‌ها رو در **variables** ذخیره کنید و بعداً فراخوانی کنید.

6
00:36.500 --> 00:44.330
این وقتی مفیده که می‌خواید کدتون انعطاف‌پذیر باشه و بتونه رفتارهای مختلفی رو که از قبل مشخص نشدن، مدیریت کنه.

7
00:44.360 --> 00:51.200
حالا بخش دوم مثل این، "که از قبل مشخص نشدن." اون چیزیه که بعداً پوشش خواهیم داد.

8
00:51.200 --> 00:58.520
فعلاً، چیزی که می‌خوام درک کنید اینه که یک **lambda expression** چیزی جز یک **method** بسیار ساده‌شده نیست.

9
00:58.520 --> 01:08.870
و این چیزی که اینجا داریم. یعنی **x** تبدیل می‌شود به **x** بزرگتر از **10**. اگه بخوایم اون رو به یک **method** کلاسیک تبدیل کنیم، به این شکل خواهد بود.

10
01:08.870 --> 01:10.310
پس من این **method** رو آماده کردم.

11
01:10.310 --> 01:17.570
**public static bool IsGreaterThanTen(int x) { return x > 10; }**

12
01:17.570 --> 01:19.820
خب این چطور منطقی هست؟

13
01:19.820 --> 01:23.960
خب قضیه اینه که اساساً همون چیزیه که ما اینجا داریم.

14
01:23.960 --> 01:29.420
ما می‌تونیم یک **lambda** رو به یک **predicate** که یک **delegate** هست، اختصاص بدیم.

15
01:29.420 --> 01:38.090
اما کاری که می‌تونیم انجام بدیم اینه که می‌تونیم یک **method** کامل رو هم اختصاص بدیم، پس می‌تونیم جلو بریم و از این **IsGreaterThanTen** استفاده کنیم...

16
01:38.090 --> 01:43.010
و اون رو به **predicate** خودمون اختصاص بدیم.

17
01:43.010 --> 01:46.370
پس این **IsGreaterThanTen** در واقع یک **method** هست.

18
01:46.370 --> 01:47.150
درسته؟

19
01:47.150 --> 01:50.390
و این **method** یک **bool** رو **return** می‌کنه.

20
01:50.390 --> 01:55.190
**predicate** نیاز داره که یک **bool** دریافت کنه چون خودش یک **bool** رو **return** می‌کنه. اوکی.

21
01:55.190 --> 01:56.090
اینجا می‌بینید.

22
01:56.090 --> 02:04.220
و نکته مهم اینه که ما **method** رو فراخوانی نمی‌کنیم. پس بعد از اون از پرانتز استفاده نمی‌کنیم. ما نمی‌تونیم این کار رو انجام بدیم.

23
02:04.220 --> 02:17.750
با این حال، می‌تونیم نام **method** رو مستقیماً به عنوان **predicate** اختصاص بدیم، و منطق در اینجا داخل **method**ی که خودمون ساختیم، پوشش داده شده.

24
02:17.750 --> 02:21.380
پس حالا ما ساده‌سازی کردیم.

25
02:21.560 --> 02:23.330
اجازه بدید برگردم اینجا.

26
02:23.330 --> 02:36.350
حالا به جای اینکه مجبور باشیم این **method** رو بسازیم، کاری که انجام دادیم اینه که فقط گفتیم، اوکی، منطق همون **lambda expression** هست. و شما می‌تونید یک **lambda expression** رو به یک **delegate** اختصاص بدید.

27
02:36.350 --> 02:44.150
چون یک **delegate**، همونطور که قبلاً گفتم، مثل یک **pointer** یا **reference** به یک **method** هست. اوکی.

28
02:44.150 --> 02:54.920
حالا این **FindAll** چکار می‌کنه؟ چون ما باید **FindAll** رو بهتر درک کنیم تا این **predicate IsGreaterThanTen** رو بهتر درک کنیم.

29
02:54.920 --> 02:57.350
پس بیایید بریم سراغ **FindAll**.

30
02:57.350 --> 03:07.370
چون کاری که **FindAll** انجام می‌ده اینه که اول بررسی می‌کنه هر چیزی که بهش پاس می‌دیم، که یک **predicate** هست، درسته، از هر نوعی. پس این **generic** هست. همونطور که گفتم بعداً **generics** رو پوشش خواهیم داد، از هر نوعی.

31
03:07.370 --> 03:17.210
و می‌گیم اگه هیچ تطابقی وجود نداشته باشه. پس اگه **match** برابر با **null** باشه، در این صورت فقط یک خطا پرتاب کن.

32
03:17.210 --> 03:26.960
اما اگه یک تطابق وجود داشته باشه، حالا جلو برو و یک **list** بساز و تمام آیتم‌های داخل اون **list** رو دونه به دونه چک کن و ببین آیا تطابقی وجود داره یا نه. حالا این **match** چیه؟

33
03:26.960 --> 03:40.070
خب، **match** اساساً همون منطقی هست که ما اینجا تعریف کردیم. پس ما تعریف کردیم که چه زمانی یک تطابق وجود داره، و یک تطابق همیشه زمانیه که **X** ما بزرگتر از **10** باشه.

34
03:40.070 --> 03:45.470
پس زیر کاپوت، کارهای زیادی داخل این **FindAll** **method** انجام می‌شه، به همین دلیله که به یک **predicate** نیاز داره.

35
03:45.470 --> 03:54.110
پس شما نمی‌تونید فقط متغیر یا خود داده‌ای رو که می‌خواید وارد کنید. نمی‌تونید فقط وارد کنید، مثلاً **greaterTen**.

36
03:54.110 --> 04:03.710
پس خیلی آسون‌تر می‌شد اگه فقط می‌گفتید چیزی مثل **greaterTen** مثلاً، یا **Ten greater x greater ten** یا همچین چیزی. اما اینطور کار نمی‌کنه.

37
04:03.710 --> 04:11.360
پس ما باید اون رو به فرمت درست بیاریم که داریم از یک **predicate** برای اون استفاده می‌کنیم.

38
04:11.360 --> 04:14.600
پس حالا خیلی از کلمات کلیدی کنار هم قرار گرفتند، درسته؟

39
04:14.600 --> 04:18.770
**Lambdas**، **predicates** و **delegates**.

40
04:18.770 --> 04:25.400
پس یک بار دیگه خلاصه می‌کنم: یک **predicate** زیر کاپوت یک **delegate** هست.

41
04:25.400 --> 04:31.640
یک **delegate** به ما اجازه می‌ده که یک **lambda** رو داخل خودش ذخیره کنیم.

42
04:31.640 --> 04:42.230
یک **lambda** فقط یک **method** بسیار ساده‌شده هست که قابل فراخوانی نخواهد بود، اما می‌تونه مستقیماً هر زمان که **predicate** استفاده می‌شه، اجرا بشه.

43
04:42.230 --> 04:49.460
پس این **FindAll** این **predicate** رو به عنوان قانون اصلی می‌گیره تا بدونه باید چه چیزی رو تطبیق بده.

44
04:49.460 --> 04:51.890
و برای این ویدیو کافیه.

45
04:51.890 --> 04:56.630
حالا، اگه این مطالب براتون سنگین بود، نگران نباشید، اوکی؟

46
04:56.630 --> 05:05.890
این چیزیه که کاملاً خوبه اگه در این نقطه، تنها چیزی که درک کردید اینه که ما اینجا داریم یک **filter** ایجاد می‌کنیم و داریم **filter** رو به **FindAll** **method** خودمون پاس می‌دیم...

47
05:05.890 --> 05:12.700
تا بعداً فقط تمام آیتم‌هایی رو که با اون **filter** مطابقت دارند، پیدا کنه.

48
05:12.700 --> 05:18.100
پس اگه این تنها چیزیه که از این **lecture** حفظ کردید و از این **lecture** درک کردید، شما عالی هستید.

49
05:18.100 --> 05:18.370
اوکی.

50
05:18.370 --> 05:25.690
شما نیازی ندارید تمام چیزهای دیگه‌ای رو که در 1 یا 2 ویدیوی آخر توضیح دادم، از قبل به طور عمیق بدونید.

51
05:25.690 --> 05:36.010
فقط می‌خواستم مطمئن بشم که می‌دونید زیر کاپوت چه خبره، اما ما اون چیزها رو بعداً در دوره با جزئیات بیشتری پوشش خواهیم داد.