بسیار خب.
بنابراین در این ویدیو من قراره یک نوع لیست قدیمی (legacy list type) به نام **ArrayList** رو بهتون نشون بدم.
و دیگه برای کدهای جدید یا پروژه‌های جدیدی که کار می‌کنید، استفاده از اون توصیه نمی‌شه.
اما وقتی روی پروژه‌های قدیمی‌تر کار می‌کنید، احتمال زیادی داره **ArrayList** ببینید و خوبه که حداقل نحوه‌ی کار اون‌ها رو بفهمید.
نیازی نیست خودتون از اون‌ها استفاده کنید و واقعاً فقط برای اینه که بدونید وجود دارن و تقریباً چطور کار می‌کنن، تا هر وقت یک پروژه‌ی قدیمی دیدید، گیج نشید که اون چیه.
باشه، پس بیایید این ویدیو رو ببینیم.
این ویدیویی هست که چند سال پیش ضبط کردم، اما از نظر نحوه‌ی کار همچنان معتبره.
باشه، پس بیایید شروع کنیم و بریم جلو و یک **ArrayList** ایجاد کنیم.
پس من قراره یک **ArrayList** جدید اینجا ایجاد کنم.
اعلامش کنم.
بنابراین اعلام کردن یک **ArrayList**.
و همونطور که می‌بینید داره خطا می‌ده چون **ArrayList** رو نمی‌شناسه.
و ما باید از **System.Collections** استفاده کنیم چون **ArrayList class** داخل **Collections class** هست.
همونطور که می‌بینید، **List Interface** رو پیاده‌سازی می‌کنه و الی آخر.
پس حالا می‌تونم جلو برم و یک اسم بهش بدم و من قراره ازش استفاده کنم یا اون رو **myArrayList** بنامم که یک **new ArrayList** هست. بنابراین این یک روش برای اعلام کردن یک **ArrayList** هست.
و یک روش دیگه اینه که همون اول بگیم چندتا شیء باید داخلش باشه.
پس در این مورد من قراره بگم باشه، **myArrayList** فقط باید 100 شیء داشته باشه.
این یکی در اینجا یک مقدار نامحدود از شیءها با مقدار نامحدود تعریف شده از شیءها داره، و اون یکی با یک مقدار تعریف شده از شیءها با یک مقدار تعریف شده. بسیار خب.
بنابراین حالا بیایید بریم جلو و تعدادی شیء یا المان به **ArrayList** اضافه کنیم.
پس **myArrayList.Add**.
همونطور که می‌بینید **myArrayList** چندین متد (method)، پروپرتی (property) و متدهای توسعه (extension methods) مختلف داره. بنابراین می‌تونید برخی از اون‌ها رو بررسی کنید.
و حتی می‌تونید چیزی مثل **clear** رو ببینید که به سادگی کل **ArrayList** رو پاک می‌کنه. بعد **contains** رو دارید.
اون بررسی می‌کنه که آیا چیزی که دنبالش هستید، داخلش هست یا نه و الی آخر.
پس تعداد زیادی متد جالب وجود داره و ما تعدادی از اون‌ها رو پوشش خواهیم داد.
پس من قراره چیزی اضافه کنم.
و همونطور که می‌بینید می‌تونم یک شیء اضافه کنم.
و این زیبایی در مورد **ArrayList**هاست.
اون‌ها لازم نیست فقط شامل **string**ها باشن یا فقط **int**ها یا فقط چیز دیگه‌ای، اون‌ها می‌تونن شامل **objects** باشن. بنابراین هر چیزی که از هر نوع شیء باشه می‌تونه اینجا استفاده بشه.
بنابراین به این معنیه که می‌تونیم **integer**ها رو داخلش ذخیره کنیم. مثلاً مقدار 25.
بعد می‌تونیم جلو بریم و **string**ها رو داخلش ذخیره کنیم، چیزی مثل "hello".
یا می‌تونیم جلو بریم و **double**ها رو داخلش ذخیره کنیم. مثلاً 13.37 و الی آخر.
پس من فقط قراره چند مقدار اضافی اینجا اضافه کنم مثل 13، **myArrayList.Add** و 128. و فقط برای اطمینان یک مقدار دیگه 25.3 خواهد بود.
و این ویرگول نیست. این یک نقطه است.
بسیار خب.
بنابراین حالا کاری که می‌تونم انجام بدم اینه که می‌تونم از برخی **method**ها روی **ArrayList** خودم استفاده کنم.
برای مثال می‌تونم از **remove method** استفاده کنم.
و در اینجا باید تعریف کنم که چی رو می‌خوام حذف کنم.
بنابراین من فقط یک **index** رو حذف نمی‌کنم، دارم می‌گم کدوم شیء رو می‌خوام حذف کنم.
پس فرض کنید می‌خوام از شر 13 خلاص شم.
پس من فقط از **remove 13** استفاده می‌کنم.
این المان با ورودی خاص رو از **ArrayList** یا با مقدار خاص حذف می‌کنه. شاید این بهتر باشه.
پس قراره 13 رو از اونجا حذف کنه.
پس فرض کنید دو بار 13 داخلش دارم که قراره اینطوری انجام بدم.
اون وقت 13 رو از لیستم حذف می‌کنه.
حالا مورد بعدی حذف در یک **index** خاصه.
پس حذف المان در یک موقعیت یا **index** خاص.
و این کار با استفاده از متد **RemoveAt** انجام می‌شه.
و می‌تونید ببینید یک **RemoveRange** هم وجود داره.
بنابراین می‌تونید به سادگی بگید باشه از اون نقطه می‌خوام دو تا مقدار رو حذف کنم.
پس فرض کنید از نقطه‌ی چهار. پس این یکی اینجا می‌خوام دو مقدار رو حذف کنم. بنابراین قراره 128 و 25.3 رو حذف کنه.
اما من قراره از **RemoveAt** استفاده کنم و اون یکی در موقعیت صفر رو حذف کنم. بنابراین باید...
این یکی رو اینجا حذف یا پاک کنه.
پس 25 و حالا چیزی به نام **Count** وجود داره.
پس اگه می‌خواید بدونید چندتا شیء داخل **ArrayList**تون هست، می‌تونید از کلمه کلیدی **Count** استفاده کنید.
حالا کاری که می‌خوام انجام بدم اینه که اون رو روی **Console** بنویسم. پس من فقط قراره اینطوری ازش استفاده کنم.
پس نوشتن **Console Count**.
بسیار خب.
حالا بریم سراغ یک چیز بسیار جالب.
بیایید یک حلقه **foreach** ایجاد کنیم که تمام اشیاء داخل **ArrayList**مون رو بررسی کنه.
و من قراره اون رو **object** یا **obj** در **myArrayList** بنامم.
و قراره از طریق تک تک اشیاء داخل **ArrayList** من بره. و اون در اون تکرار، **object** خواهد بود.
پس کاری که می‌تونیم انجام بدیم اینه که می‌تونیم بررسی کنیم اگه **object** از نوع **int** هست، اون وقت می‌تونیم کدی بنویسیم.
پس فرض کنید می‌خوام تمام اعداد رو با هم جمع کنم.
و البته نمی‌خوام **string** رو اینجا اضافه کنم.
پس من قراره یک **double** جدید **result** ایجاد کنم.
یا می‌تونید اون رو **sum** بنامید.
شاید **sum** دقیق‌تر باشه.
این **sum** خواهد بود.
و حالا **sum** من باید **integer** و **double**هایی باشه که داخل **ArrayList** من هستن.
اما حالا، چون نمی‌تونم به سادگی یک **integer** رو به یک **double** اضافه کنم، باید اون رو تبدیل کنم.
پس من قراره از **Convert.ToDouble** استفاده کنم. و اینجا قراره بگم **obj** چون **object** یک شیء هست یا **obj** یک شیء هست.
اون یک **integer** نیست، یک **integer** رو شامل می‌شه، اما از نوع **object** هست.
بنابراین می‌تونم اون رو به یک **double** **cast** کنم و به سادگی به یک **double** اضافه کنم.
اما اگه یک **double** نیست، باید اون رو به یک **double** تبدیل کنم.
پس اگه یک **integer** هست، می‌تونم اون رو به یک **double** تبدیل کنم.
پس دارم بررسی می‌کنم آیا یک **integer** هست؟ بله هست. بسیار خب.
پس بیایید اون رو به یک **double** تبدیل کنیم و به **sum**مون اضافه کنیم.
و اینجا **else if obj** یک **double** هست.
پس اگه اینطور بود، اون وقت به سادگی از **sum +=** استفاده کن.
و اینجا نمی‌تونی فقط بگی **obj**. همونطور که می‌بینی نمی‌تونم به سادگی شیء رو اضافه کنم.
این به این دلیله که این یک **object** هست و یک **double** نیست. و نمی‌تونی به سادگی یک **object** رو به یک **double** اضافه کنی، همونطور که گفتم.
پس کاری که باید اینجا انجام بدی، استفاده از **Casting** هست.
پس در اینجا قراره بگم می‌خوام اون شیء رو به یک **double** **cast** کنم. و اگه این کار انجام شد، لطفاً اون رو به **sum** اضافه کن.
و حالا در نهایت **else**.
و اینجا می‌تونستم البته بررسی کنم اگه **obj** **string** هست.
پس اگه اینطور بود، اون وقت به سادگی اون رو روی **Console** بنویس. پس فقط **obj** رو بنویس. بسیار خب.
حالا بیایید **Console** رو بنویسیم یا از **Console** استفاده کنیم تا ببینیم نتیجه چی بوده.
نتیجه (result) و نه با حرف بزرگ.
و در واقع من اون رو **sum** نامیدم.
و در نهایت **Console.ReadKey**.
حالا بیایید اجراش کنیم.
و همونطور که می‌بینید ما 5 رو می‌گیریم. ما "hello" و 179.67 رو می‌گیریم.
پس این اعداد چی هستن؟
این 5، تعداد المان‌های داخل **ArrayList** منه. پس اینجا می‌گه **count** و **count** برابر با 5 هست.
اگه اینجا بررسی کنیم چندتا مقدار داشتیم. خب ما 7 تا داشتیم 1 2 3 4 5 6 7.
و ما 13 رو حذف کردیم و صفر رو حذف کردیم.
پس حالا بیایید بررسی کنیم که آیا 13 هنوز داخلش هست یا نه.
پس اگه ما اون 13.37 رو بگیریم و 128 و 25.3 رو به اضافه 13 کنیم، همونطور که می‌بینید این نتیجه رو به ما می‌ده.
پس حذف **remove 13** المان با یک مقدار خاص رو حذف کرد.
پس یک المان رو حذف کرد و نه همه اون‌ها رو، همونطور که اینجا می‌بینید.
پس داره یک 13 رو حذف می‌کنه و فقط داره اولین 13 رو حذف می‌کنه.
پس بیایید اون رو کپی کنیم و دوباره اجرا کنیم.
و حالا 13 رو دو بار حذف خواهد کرد.
و همونطور که می‌بینید این مقدار 166 رو می‌گیریم.
پس هنوز یک 13 داخلش بوده.
پس بیایید دوباره اجراش کنیم وقتی که هیچ 13ای داخلش نیست.
و همونطور که می‌بینید همه چیز خوبه.
پس سعی کرد چیزی رو حذف کنه. اما چیزی نبود.
پس اگه چیزی نیست، همونطور که می‌بینید هیچ کاری انجام نمی‌ده. با وجود اینکه ما سه بار سعی کردیم این 13 رو حذف کنیم یا 13 رو پاک کنیم و دیگه هیچ 13ای داخلش نبود. بسیار خب.
پس این یک شروع کوچیک به **ArrayList** بود.
و همونطور که می‌بینید چیزهای زیادی در مورد **ArrayList**ها وجود داره که باید بدونید. و اون‌ها خیلی باحالن.
و در ویدیوی بعدی قراره بریم جلو و حتی از متدهای بیشتری از **ArrayList class** استفاده کنیم.
اما قبل از اون، دوست دارم سریع در مورد چیزی که صحبت نکردم، یعنی این **object** اینجا، صحبت کنم.
پس چرا من اینجا از **object** در **ArrayList** خودم استفاده می‌کنم به جای، مثلاً **ArrayList** به عنوان نوع داده؟ یا حتی **integer** یا **string**.
خب، من اینجا از **object** استفاده می‌کنم چون **object** بالاترین سطح **class**ی هست که وجود داره.
هر **class** دیگه‌ای به نوعی داره از اون **class object** به ارث می‌بره.
به همین دلیله که می‌تونیم اینجا از **object** استفاده کنیم، چون هر نوع داده‌ی متفاوتی که داخل **ArrayList** من باشه با این کار خواهد کرد.
چون اگه به **ArrayList**مون نگاه کنیم، یک **integer** داریم. اینجا یک **string** داریم. بعد یک **double** داخلش داریم.
پس ما سه نوع داده‌ی متفاوت داخلش داریم.
و ما نمی‌تونیم فقط بگیم باشه **object** یا این **obj** قراره یک **integer** باشه، یا قراره یک **string** یا یک **double** باشه.
چون این درست نخواهد بود، چون اون همه‌ی اون چیزهاست.
درسته. و **object** به سادگی این رو مدیریت می‌کنه.
بنابراین اگه از این رویکرد استفاده کنیم، اون به اندازه‌ی کافی باهوش خواهد بود که بفهمه، باشه.
در صورتی که یک **integer** نیست، اون رو مدیریت می‌کنه و به **sum** اضافه می‌کنه.
در غیر این صورت اگه یک **double** باشه به **sum** اضافه می‌کنه.
اما اگه یک **string** باشه، به سادگی **string** رو چاپ می‌کنه. بسیار خب.
من فقط می‌خواستم مطمئن شم که این کاملاً واضحه.
به همین دلیله که این قسمت کوچک رو به ویدیو اضافه کردم.
اگه سوال دیگه‌ای دارید که احساس می‌کنید به خوبی توضیح داده نشده، لطفاً در بخش پرسش و پاسخ به من اطلاع بدید و من دستورالعمل‌ها یا توضیحات اضافی رو به درس‌ها اضافه خواهم کرد.
بسیار خب.
پس شما رو در ویدیوی بعدی می‌بینم.