بسیار خب، پس تصمیم گرفتم ایده کلی اینکه **delegate** چیه رو به شما نشون بدم.
اوکی، ما **delegates** رو بعداً با جزئیات بیشتری پوشش خواهیم داد چون وقتی صحبت از **events** (رویدادها) می‌شه، بسیار مهم هستن، و این وقتی صحبت از **graphical user interfaces** (رابط‌های کاربری گرافیکی) می‌شه، خیلی مهمه.
پس بیایید در یک سطح فوق‌العاده بالا ببینیم **delegate** چیه، اوکی.
پس در **C#**، یک **delegate** مثل یک **pointer** یا **reference** به یک **method** هست.
این به شما اجازه می‌ده که **methods** رو به عنوان **arguments** به **methods** دیگه پاس بدید، اون‌ها رو در **variables** ذخیره کنید و بعداً فراخوانی کنید.
این وقتی مفیده که می‌خواید کدتون انعطاف‌پذیر باشه و بتونه رفتارهای مختلفی رو که از قبل مشخص نشدن، مدیریت کنه.
حالا بخش دوم مثل این، "که از قبل مشخص نشدن." اون چیزیه که بعداً پوشش خواهیم داد.
فعلاً، چیزی که می‌خوام درک کنید اینه که یک **lambda expression** چیزی جز یک **method** بسیار ساده‌شده نیست.
و این چیزی که اینجا داریم. یعنی **x** تبدیل می‌شود به **x** بزرگتر از **10**. اگه بخوایم اون رو به یک **method** کلاسیک تبدیل کنیم، به این شکل خواهد بود.
پس من این **method** رو آماده کردم.
**public static bool IsGreaterThanTen(int x) { return x > 10; }**
خب این چطور منطقی هست؟
خب قضیه اینه که اساساً همون چیزیه که ما اینجا داریم.
ما می‌تونیم یک **lambda** رو به یک **predicate** که یک **delegate** هست، اختصاص بدیم.
اما کاری که می‌تونیم انجام بدیم اینه که می‌تونیم یک **method** کامل رو هم اختصاص بدیم، پس می‌تونیم جلو بریم و از این **IsGreaterThanTen** استفاده کنیم...
و اون رو به **predicate** خودمون اختصاص بدیم.
پس این **IsGreaterThanTen** در واقع یک **method** هست.
درسته؟
و این **method** یک **bool** رو **return** می‌کنه.
**predicate** نیاز داره که یک **bool** دریافت کنه چون خودش یک **bool** رو **return** می‌کنه. اوکی.
اینجا می‌بینید.
و نکته مهم اینه که ما **method** رو فراخوانی نمی‌کنیم. پس بعد از اون از پرانتز استفاده نمی‌کنیم. ما نمی‌تونیم این کار رو انجام بدیم.
با این حال، می‌تونیم نام **method** رو مستقیماً به عنوان **predicate** اختصاص بدیم، و منطق در اینجا داخل **method**ی که خودمون ساختیم، پوشش داده شده.
پس حالا ما ساده‌سازی کردیم.
اجازه بدید برگردم اینجا.
حالا به جای اینکه مجبور باشیم این **method** رو بسازیم، کاری که انجام دادیم اینه که فقط گفتیم، اوکی، منطق همون **lambda expression** هست. و شما می‌تونید یک **lambda expression** رو به یک **delegate** اختصاص بدید.
چون یک **delegate**، همونطور که قبلاً گفتم، مثل یک **pointer** یا **reference** به یک **method** هست. اوکی.
حالا این **FindAll** چکار می‌کنه؟ چون ما باید **FindAll** رو بهتر درک کنیم تا این **predicate IsGreaterThanTen** رو بهتر درک کنیم.
پس بیایید بریم سراغ **FindAll**.
چون کاری که **FindAll** انجام می‌ده اینه که اول بررسی می‌کنه هر چیزی که بهش پاس می‌دیم، که یک **predicate** هست، درسته، از هر نوعی. پس این **generic** هست. همونطور که گفتم بعداً **generics** رو پوشش خواهیم داد، از هر نوعی.
و می‌گیم اگه هیچ تطابقی وجود نداشته باشه. پس اگه **match** برابر با **null** باشه، در این صورت فقط یک خطا پرتاب کن.
اما اگه یک تطابق وجود داشته باشه، حالا جلو برو و یک **list** بساز و تمام آیتم‌های داخل اون **list** رو دونه به دونه چک کن و ببین آیا تطابقی وجود داره یا نه. حالا این **match** چیه؟
خب، **match** اساساً همون منطقی هست که ما اینجا تعریف کردیم. پس ما تعریف کردیم که چه زمانی یک تطابق وجود داره، و یک تطابق همیشه زمانیه که **X** ما بزرگتر از **10** باشه.
پس زیر کاپوت، کارهای زیادی داخل این **FindAll** **method** انجام می‌شه، به همین دلیله که به یک **predicate** نیاز داره.
پس شما نمی‌تونید فقط متغیر یا خود داده‌ای رو که می‌خواید وارد کنید. نمی‌تونید فقط وارد کنید، مثلاً **greaterTen**.
پس خیلی آسون‌تر می‌شد اگه فقط می‌گفتید چیزی مثل **greaterTen** مثلاً، یا **Ten greater x greater ten** یا همچین چیزی. اما اینطور کار نمی‌کنه.
پس ما باید اون رو به فرمت درست بیاریم که داریم از یک **predicate** برای اون استفاده می‌کنیم.
پس حالا خیلی از کلمات کلیدی کنار هم قرار گرفتند، درسته؟
**Lambdas**، **predicates** و **delegates**.
پس یک بار دیگه خلاصه می‌کنم: یک **predicate** زیر کاپوت یک **delegate** هست.
یک **delegate** به ما اجازه می‌ده که یک **lambda** رو داخل خودش ذخیره کنیم.
یک **lambda** فقط یک **method** بسیار ساده‌شده هست که قابل فراخوانی نخواهد بود، اما می‌تونه مستقیماً هر زمان که **predicate** استفاده می‌شه، اجرا بشه.
پس این **FindAll** این **predicate** رو به عنوان قانون اصلی می‌گیره تا بدونه باید چه چیزی رو تطبیق بده.
و برای این ویدیو کافیه.
حالا، اگه این مطالب براتون سنگین بود، نگران نباشید، اوکی؟
این چیزیه که کاملاً خوبه اگه در این نقطه، تنها چیزی که درک کردید اینه که ما اینجا داریم یک **filter** ایجاد می‌کنیم و داریم **filter** رو به **FindAll** **method** خودمون پاس می‌دیم...
تا بعداً فقط تمام آیتم‌هایی رو که با اون **filter** مطابقت دارند، پیدا کنه.
پس اگه این تنها چیزیه که از این **lecture** حفظ کردید و از این **lecture** درک کردید، شما عالی هستید.
اوکی.
شما نیازی ندارید تمام چیزهای دیگه‌ای رو که در 1 یا 2 ویدیوی آخر توضیح دادم، از قبل به طور عمیق بدونید.
فقط می‌خواستم مطمئن بشم که می‌دونید زیر کاپوت چه خبره، اما ما اون چیزها رو بعداً در دوره با جزئیات بیشتری پوشش خواهیم داد.