دوباره خوش آمدید.
در این ویدیو می‌خوام **list**ها (لیست‌ها) رو به شما معرفی کنم.
و یاد خواهید گرفت که چه زمانی باید از اون‌ها استفاده کنید و چگونه استفاده کنید.
و بعد ما یک سری مثال خواهیم داشت که در اون‌ها هر چیزی رو که در این ارائه یاد می‌گیرید،
به کار خواهیم بست.
پس اول از همه، **list** چیست؟ خب **list**، همونطور که می‌بینید توسط این براکت‌های کوچکتر و بزرگتر احاطه شده است.
**T** یک مجموعه (collection) عمومی (generic) است که عناصر رو در یک دنباله خطی ذخیره می‌کنه.
و برخلاف **array**ها (آرایه‌ها)، **list**ها پویا (dynamic) هستن، به این معنی که اندازه اون‌ها می‌تونه در صورت نیاز افزایش یا کاهش پیدا کنه.
چون ما دیده‌ایم که با **array**ها باید تعریف کنیم که چند مورد می‌خوایم در اون **array** داشته باشیم، و بعد از مقداردهی اولیه نمی‌تونیم اون رو تغییر بدیم.
و اینجا در واقع می‌تونیم تعداد مواردی رو که در **list** هستن، تغییر بدیم.
خب این **T** چیه؟
خب، **T** در **List** در **C-sharp** یک نگهدارنده جا برای یک نوع (type) هست، و می‌تونید اون رو مثل یک فضای خالی در یک دنباله در نظر بگیرید که می‌تونید با هر نوعی مثل **int**، **string** یا حتی یک **class** که خودتون ایجاد می‌کنید، مثل **Car** یا **Customer** که قبلاً ایجاد کردیم، پر کنید.
مثل **Car** یا **Customer** که قبلاً ایجاد کردیم، پر کنید.
و این به شما اجازه می‌ده که یک **list** رو به طور خاص برای اون نوع از مورد ایجاد کنید.
پس تصور کنید یک جعبه دارید که می‌خواید فقط سیب در اون ذخیره کنید و می‌تونید این جعبه رو جعبه سیب نامگذاری کنید.
به طور مشابه، اگه یک جعبه برای ذخیره فقط کتاب دارید، ممکنه اون رو جعبه کتاب نامگذاری کنید و در **C-sharp** این
**List** مثل یکی از این جعبه‌هاست، اما می‌تونید تصمیم بگیرید که چه نوع مواردی رو نگه خواهد داشت، وقتی شروع به استفاده از اون می‌کنید.
پس **T** برچسبیه که روی جعبه می‌ذارید و به شما می‌گه که چی می‌تونید داخل جعبه بذارید.
پس اینجا ما یک مثال از اعداد داریم.
پس اینجا جعبه‌ایه که فقط اعداد رو نگه می‌داره.
پس **List** و علامت کوچکتر **int** علامت بزرگتر **numbers**.
و بعد ما این **new list** رو ایجاد می‌کنیم.
و دوباره علامت کوچکتر **int** (یعنی **data type**) علامت بزرگتر.
و بعد براکت‌ها و البته نقطه ویرگول.
و بعد از چیزی به نام متد **list**، متد **Add** استفاده می‌کنیم که عدد یک رو به جعبه اضافه می‌کنیم.
و بعد همین کار رو با عدد دو در خط بعدی انجام می‌دیم.
و ما یک سری متد خواهیم دید که **list**ها ارائه می‌دن.
حالا ما این جعبه دیگه رو داریم که اون رو **names** (اسم‌ها) می‌نامیم.
و این قراره یک **list** از **string**ها باشه.
پس می‌تونید ببینید ساختار یکسانه.
فقط حالا فقط **string**ها رو قبول می‌کنه.
و این فقط برای **base data type**ها یا **simple data type**ها کار می‌کنه.
اما همچنین برای **object**هایی از **class**هایی که ما ایجاد می‌کنیم یا قبلاً وجود دارن، کار می‌کنه.
پس چرا باید از این کاراکتر **T** (یعنی **T** بزرگ) استفاده کنید؟
خب، این **list** رو چندکاره می‌کنه چون می‌تونید تعریف کنید که هر بار که ازش استفاده می‌کنید، چه نوع مواردی رو نگه
خواهد داشت. درست مثل اینکه هر بار یک جعبه جدید می‌گیرید، می‌تونید تصمیم بگیرید که چی توش بذارید.
این به شما کمک می‌کنه تا مواردتون رو سازماندهی شده و ایمن نگه دارید، و مطمئن می‌شید که به طور تصادفی نوع اشتباهی از مورد رو در **list** یا جعبه خودتون قرار نمی‌دید.
پس به طور خلاصه، **T** در **List** راهی برای ایجاد یک **list** است که به طور سفارشی برای نگهداری یک نوع خاص از مورد طراحی شده، که می‌تونید هنگام ایجاد **list** در موردش تصمیم بگیرید.
این کد شما رو با هر **data type**ای انعطاف‌پذیر و قابل استفاده مجدد می‌کنه.
پس بیاید به **properties** (**ویژگی‌های**) **list**ها نگاه کنیم.
**List**ها **property** **Count** رو دارن که تعداد عناصر موجود در **list** رو می‌گیره، و بعد شما
**property** **Capacity** رو دارید که تعداد عناصری رو که **list** می‌تونه نگه داره قبل از اینکه نیاز به تغییر اندازه داشته باشه، می‌گیره یا تنظیم می‌کنه.
پس بیاید به متدهای اصلی که داریم نگاه کنیم.
پس ما **Add item** و **Remove item** رو داریم.
پس **Add item** یک مورد رو به انتهای **list** اضافه می‌کنه و **Remove item** اولین وقوع یک **object** خاص رو از **list** حذف می‌کنه.
از **list** حذف می‌کنه.
پس خواهیم دید که دقیقاً به چه معناست.
همونطور که می‌بینید، فقط آخرین مورد یا اولین مورد رو حذف نمی‌کنه، بلکه خود مورد واقعی رو که ما درخواست حذفش رو
داریم، حذف می‌کنه. اما می‌تونیم در مورد چیزی که می‌خوایم حذف کنیم هم خاص‌تر باشیم.
بعد این متد **Insert** رو داریم **int index T item**، به این معنی که می‌تونید یک عنصر رو در یک **index** مشخص درج کنید.
و بعد این متد **Find** رو داریم که به دنبال عنصری می‌گرده که با شرط تعریف شده توسط یک محمول (predicate) مشخص مطابقت داشته باشه.
و خواهیم دید که محمول‌ها چی هستن و چطور از اون‌ها استفاده کنیم، یا متدهای **Find** رو به طور خاص داخل
دموهای خودمون، یا در دموها، تعریف کنیم.
خب، بعد ما متد **Sort** رو داریم که به شما اجازه می‌ده عناصر رو در کل **list** مرتب کنید، که خیلی باحاله، یک ویژگی بسیار قدرتمند و بسیار ساده.
بعد متد **Clear** رو داریم که تمام عناصر رو از **list** حذف می‌کنه.
و ما این متد **ToArray** رو داریم، که به شما اجازه می‌ده عناصر **list** رو به یک **array** جدید کپی کنید.
پس اگه می‌خواید از یک **list** استفاده کنید اما نیاز به استفاده از یک **array** دارید، می‌تونید **list** رو به یک **array** تبدیل کنید و بعد از اون **array** استفاده کنید.
چون مثلاً متدی که استفاده می‌کنید به جای یک **list** به یک **array** نیاز داره. در این صورت می‌تونید با استفاده از متد **ToArray** اون رو تبدیل کنید.
و بعد **IndexOf item** وجود داره.
این **index** رو که این مورد خاص در اون قرار داره، **return** می‌کنه.
اما خیلی مهم اینجاست، اولین وقوع اون مورد یا **object** خاص.
پس اگه این مورد رو چندین بار در **list** داشته باشید، باز هم فقط اولین مورد رو به شما می‌ده.
پس این چیزیه که باید ازش آگاه باشید.
خب، موارد استفاده معمول برای **list**ها چیست؟
خب اول از همه رکوردهای پایگاه داده.
پس وقتی رکوردها رو از یک پایگاه داده واکشی می‌کنید و تعداد رکوردها از قبل مشخص نیست، یک **list** به دلیل ماهیت پویای خودش، ایده‌آل هست.
بعد دستکاری داده‌ها وجود داره، جایی که **list**ها وقتی نیاز به اضافه کردن، حذف کردن یا مرتب‌سازی مکرر عناصر دارید، مفید هستن،
و بعد انواع بازگشتی (return types) برای مجموعه‌ها.
پس متدهایی که یک مجموعه از موارد رو **return** می‌کنن، اغلب از **list**ها استفاده می‌کنن چون اون‌ها انعطاف‌پذیرتر و قدرتمندتر از **array**ها هستن.
اوکی، پس بهترین شیوه‌ها (best practices) چیست؟
خب مدیریت ظرفیت وجود داره که باید ازش آگاه باشید.
پس اگه تعداد تقریبی مواردی رو که **list** نگه خواهد داشت می‌دونید، تنظیم ظرفیت اولیه می‌تونه عملکرد رو با کاهش تعداد جابجایی‌های حافظه مورد نیاز در حین رشد **list**، بهبود ببخشه.
و بعد باید از حلقه‌های **foreach** هر وقت با **list**ها کار می‌کنید استفاده کنید، زمانی که نیازی به تغییر **list** در طول تکرار ندارید.
پس حلقه‌های **foreach** فقط یک سینتکس تمیزتر نسبت به حلقه‌های **for** ارائه می‌دن.
حالا بیاید این دو رو با هم مقایسه کنیم.
اول از همه انعطاف‌پذیری اندازه.
پس **array**ها در اندازه ثابت هستن.
به این معنی که وقتی تعداد عناصری رو که می‌تونه نگه داره تعریف می‌کنید، بدون ایجاد یک **array** جدید، قابل تغییر اندازه نیست.
**List**ها، از طرف دیگه، می‌تونن اندازه‌شون رو به صورت پویا تنظیم کنن.
پس هر وقت به یک مجموعه پویا نیاز دارید، **list**ها راه حل هستن.
وقتی صحبت از عملکرد می‌شه.
**Array**ها عملکرد کمی بهتری رو ارائه می‌دن، پس برای **indexing** و تکرار، چون ساده‌تر هستن و دسترسی مستقیم به مکان‌های حافظه خودشون دارن.
با این حال، **list**ها هم هنوز کاملاً کارآمد هستن و به دلیل تغییر اندازه پویا و سایر ویژگی‌های اضافی که در پس‌زمینه اجرا می‌شن، کمی سربار (overhead) دارن.
بعد بحث عملکرد وجود داره، و **array**ها یک ساختار داده ساده برای ذخیره‌سازی و
دسترسی به تعداد ثابتی از عناصر ارائه می‌دن.
با این حال، **list**ها با متدهای داخلی بسیار بیشتری برای جستجو، مرتب‌سازی و دستکاری داده‌ها همراه هستن، که می‌تونه خیلی اوقات به کار بیاد.
پس وقتی صحبت از سهولت استفاده می‌شه، **list**ها عموماً وقتی نیاز به اضافه کردن یا حذف مکرر موارد دارید، راحت‌تر هستن.
با این حال، **array**ها وقتی تعداد عناصر از قبل مشخصه و تغییر نمی‌کنه، ترجیح داده می‌شن.
اوکی، پس این یک نمای کلی از **array**ها و **list**ها، نحوه مقایسه اون‌ها با یکدیگر و به طور کلی نحوه کار **list**ها رو به شما داد.
اما واضحاً ما قراره به تمرین زیاد هم بپردازیم با برخی تمرین‌ها و البته برخی دموها.
پس شما رو در ویدیوی بعدی می‌بینم.