1
00:00.170 --> 00:00.980
دوباره خوش آمدید.

2
00:00.980 --> 00:03.740
در این ویدیو می‌خوام **list**ها (لیست‌ها) رو به شما معرفی کنم.

3
00:03.740 --> 00:06.200
و یاد خواهید گرفت که چه زمانی باید از اون‌ها استفاده کنید و چگونه استفاده کنید.

4
00:06.200 --> 00:12.530
و بعد ما یک سری مثال خواهیم داشت که در اون‌ها هر چیزی رو که در این ارائه یاد می‌گیرید،

5
00:12.530 --> 00:14.480
به کار خواهیم بست.

6
00:14.480 --> 00:19.790
پس اول از همه، **list** چیست؟ خب **list**، همونطور که می‌بینید توسط این براکت‌های کوچکتر و بزرگتر احاطه شده است.

7
00:19.790 --> 00:24.140
**T** یک مجموعه (collection) عمومی (generic) است که عناصر رو در یک دنباله خطی ذخیره می‌کنه.

8
00:24.140 --> 00:30.380
و برخلاف **array**ها (آرایه‌ها)، **list**ها پویا (dynamic) هستن، به این معنی که اندازه اون‌ها می‌تونه در صورت نیاز افزایش یا کاهش پیدا کنه.

9
00:30.380 --> 00:38.540
چون ما دیده‌ایم که با **array**ها باید تعریف کنیم که چند مورد می‌خوایم در اون **array** داشته باشیم، و بعد از مقداردهی اولیه نمی‌تونیم اون رو تغییر بدیم.

10
00:38.540 --> 00:43.520
و اینجا در واقع می‌تونیم تعداد مواردی رو که در **list** هستن، تغییر بدیم.

11
00:43.520 --> 00:45.170
خب این **T** چیه؟

12
00:45.380 --> 00:59.720
خب، **T** در **List<T>** در **C-sharp** یک نگهدارنده جا برای یک نوع (type) هست، و می‌تونید اون رو مثل یک فضای خالی در یک دنباله در نظر بگیرید که می‌تونید با هر نوعی مثل **int**، **string** یا حتی یک **class** که خودتون ایجاد می‌کنید، مثل **Car** یا **Customer** که قبلاً ایجاد کردیم، پر کنید.

13
00:59.720 --> 01:02.960
مثل **Car** یا **Customer** که قبلاً ایجاد کردیم، پر کنید.

14
01:02.960 --> 01:07.970
و این به شما اجازه می‌ده که یک **list** رو به طور خاص برای اون نوع از مورد ایجاد کنید.

15
01:07.970 --> 01:14.180
پس تصور کنید یک جعبه دارید که می‌خواید فقط سیب در اون ذخیره کنید و می‌تونید این جعبه رو جعبه سیب نامگذاری کنید.

16
01:14.180 --> 01:21.590
به طور مشابه، اگه یک جعبه برای ذخیره فقط کتاب دارید، ممکنه اون رو جعبه کتاب نامگذاری کنید و در **C-sharp** این

17
01:21.590 --> 01:31.220
**List<T>** مثل یکی از این جعبه‌هاست، اما می‌تونید تصمیم بگیرید که چه نوع مواردی رو نگه خواهد داشت، وقتی شروع به استفاده از اون می‌کنید.

18
01:31.220 --> 01:37.670
پس **T** برچسبیه که روی جعبه می‌ذارید و به شما می‌گه که چی می‌تونید داخل جعبه بذارید.

19
01:37.670 --> 01:40.730
پس اینجا ما یک مثال از اعداد داریم.

20
01:40.730 --> 01:43.550
پس اینجا جعبه‌ایه که فقط اعداد رو نگه می‌داره.

21
01:43.550 --> 01:47.960
پس **List** و علامت کوچکتر **int** علامت بزرگتر **numbers**.

22
01:47.960 --> 01:49.850
و بعد ما این **new list** رو ایجاد می‌کنیم.

23
01:49.850 --> 01:54.320
و دوباره علامت کوچکتر **int** (یعنی **data type**) علامت بزرگتر.

24
01:54.320 --> 01:56.960
و بعد براکت‌ها و البته نقطه ویرگول.

25
01:56.960 --> 02:04.010
و بعد از چیزی به نام متد **list**، متد **Add** استفاده می‌کنیم که عدد یک رو به جعبه اضافه می‌کنیم.

26
02:04.010 --> 02:07.280
و بعد همین کار رو با عدد دو در خط بعدی انجام می‌دیم.

27
02:07.280 --> 02:10.730
و ما یک سری متد خواهیم دید که **list**ها ارائه می‌دن.

28
02:10.730 --> 02:13.910
حالا ما این جعبه دیگه رو داریم که اون رو **names** (اسم‌ها) می‌نامیم.

29
02:13.910 --> 02:16.250
و این قراره یک **list** از **string**ها باشه.

30
02:16.250 --> 02:18.890
پس می‌تونید ببینید ساختار یکسانه.

31
02:18.890 --> 02:21.290
فقط حالا فقط **string**ها رو قبول می‌کنه.

32
02:21.290 --> 02:26.420
و این فقط برای **base data type**ها یا **simple data type**ها کار می‌کنه.

33
02:26.420 --> 02:32.180
اما همچنین برای **object**هایی از **class**هایی که ما ایجاد می‌کنیم یا قبلاً وجود دارن، کار می‌کنه.

34
02:32.180 --> 02:36.290
پس چرا باید از این کاراکتر **T** (یعنی **T** بزرگ) استفاده کنید؟

35
02:36.290 --> 02:42.200
خب، این **list** رو چندکاره می‌کنه چون می‌تونید تعریف کنید که هر بار که ازش استفاده می‌کنید، چه نوع مواردی رو نگه

36
02:42.200 --> 02:46.580
خواهد داشت. درست مثل اینکه هر بار یک جعبه جدید می‌گیرید، می‌تونید تصمیم بگیرید که چی توش بذارید.

37
02:46.580 --> 02:55.580
این به شما کمک می‌کنه تا مواردتون رو سازماندهی شده و ایمن نگه دارید، و مطمئن می‌شید که به طور تصادفی نوع اشتباهی از مورد رو در **list** یا جعبه خودتون قرار نمی‌دید.

38
02:55.580 --> 03:06.830
پس به طور خلاصه، **T** در **List<T>** راهی برای ایجاد یک **list** است که به طور سفارشی برای نگهداری یک نوع خاص از مورد طراحی شده، که می‌تونید هنگام ایجاد **list** در موردش تصمیم بگیرید.

39
03:06.830 --> 03:10.640
این کد شما رو با هر **data type**ای انعطاف‌پذیر و قابل استفاده مجدد می‌کنه.

40
03:10.640 --> 03:13.010
پس بیاید به **properties** (**ویژگی‌های**) **list**ها نگاه کنیم.

41
03:13.010 --> 03:18.080
**List**ها **property** **Count** رو دارن که تعداد عناصر موجود در **list** رو می‌گیره، و بعد شما

42
03:18.080 --> 03:25.550
**property** **Capacity** رو دارید که تعداد عناصری رو که **list** می‌تونه نگه داره قبل از اینکه نیاز به تغییر اندازه داشته باشه، می‌گیره یا تنظیم می‌کنه.

43
03:25.550 --> 03:27.860
پس بیاید به متدهای اصلی که داریم نگاه کنیم.

44
03:27.860 --> 03:30.440
پس ما **Add item** و **Remove item** رو داریم.

45
03:30.440 --> 03:38.570
پس **Add item** یک مورد رو به انتهای **list** اضافه می‌کنه و **Remove item** اولین وقوع یک **object** خاص رو از **list** حذف می‌کنه.

46
03:38.570 --> 03:40.520
از **list** حذف می‌کنه.

47
03:40.520 --> 03:43.130
پس خواهیم دید که دقیقاً به چه معناست.

48
03:43.130 --> 03:52.040
همونطور که می‌بینید، فقط آخرین مورد یا اولین مورد رو حذف نمی‌کنه، بلکه خود مورد واقعی رو که ما درخواست حذفش رو

49
03:52.040 --> 03:55.220
داریم، حذف می‌کنه. اما می‌تونیم در مورد چیزی که می‌خوایم حذف کنیم هم خاص‌تر باشیم.

50
03:55.220 --> 04:03.290
بعد این متد **Insert** رو داریم **int index T item**، به این معنی که می‌تونید یک عنصر رو در یک **index** مشخص درج کنید.

51
04:03.290 --> 04:11.780
و بعد این متد **Find** رو داریم که به دنبال عنصری می‌گرده که با شرط تعریف شده توسط یک محمول (predicate) مشخص مطابقت داشته باشه.

52
04:11.780 --> 04:18.620
و خواهیم دید که محمول‌ها چی هستن و چطور از اون‌ها استفاده کنیم، یا متدهای **Find** رو به طور خاص داخل

53
04:18.620 --> 04:20.060
دموهای خودمون، یا در دموها، تعریف کنیم.

54
04:20.060 --> 04:27.860
خب، بعد ما متد **Sort** رو داریم که به شما اجازه می‌ده عناصر رو در کل **list** مرتب کنید، که خیلی باحاله، یک ویژگی بسیار قدرتمند و بسیار ساده.

55
04:27.860 --> 04:31.130
بعد متد **Clear** رو داریم که تمام عناصر رو از **list** حذف می‌کنه.

56
04:31.130 --> 04:37.280
و ما این متد **ToArray** رو داریم، که به شما اجازه می‌ده عناصر **list** رو به یک **array** جدید کپی کنید.

57
04:37.280 --> 04:45.590
پس اگه می‌خواید از یک **list** استفاده کنید اما نیاز به استفاده از یک **array** دارید، می‌تونید **list** رو به یک **array** تبدیل کنید و بعد از اون **array** استفاده کنید.

58
04:45.590 --> 04:52.970
چون مثلاً متدی که استفاده می‌کنید به جای یک **list** به یک **array** نیاز داره. در این صورت می‌تونید با استفاده از متد **ToArray** اون رو تبدیل کنید.

59
04:52.970 --> 04:55.760
و بعد **IndexOf item** وجود داره.

60
04:55.760 --> 04:59.690
این **index** رو که این مورد خاص در اون قرار داره، **return** می‌کنه.

61
04:59.850 --> 05:05.100
اما خیلی مهم اینجاست، اولین وقوع اون مورد یا **object** خاص.

62
05:05.100 --> 05:10.980
پس اگه این مورد رو چندین بار در **list** داشته باشید، باز هم فقط اولین مورد رو به شما می‌ده.

63
05:10.980 --> 05:13.050
پس این چیزیه که باید ازش آگاه باشید.

64
05:13.050 --> 05:16.470
خب، موارد استفاده معمول برای **list**ها چیست؟

65
05:16.470 --> 05:19.020
خب اول از همه رکوردهای پایگاه داده.

66
05:19.020 --> 05:27.450
پس وقتی رکوردها رو از یک پایگاه داده واکشی می‌کنید و تعداد رکوردها از قبل مشخص نیست، یک **list** به دلیل ماهیت پویای خودش، ایده‌آل هست.

67
05:27.450 --> 05:34.530
بعد دستکاری داده‌ها وجود داره، جایی که **list**ها وقتی نیاز به اضافه کردن، حذف کردن یا مرتب‌سازی مکرر عناصر دارید، مفید هستن،

68
05:34.530 --> 05:38.970
و بعد انواع بازگشتی (return types) برای مجموعه‌ها.

69
05:38.970 --> 05:47.370
پس متدهایی که یک مجموعه از موارد رو **return** می‌کنن، اغلب از **list**ها استفاده می‌کنن چون اون‌ها انعطاف‌پذیرتر و قدرتمندتر از **array**ها هستن.

70
05:47.370 --> 05:50.160
اوکی، پس بهترین شیوه‌ها (best practices) چیست؟

71
05:50.160 --> 05:53.460
خب مدیریت ظرفیت وجود داره که باید ازش آگاه باشید.

72
05:53.460 --> 06:04.410
پس اگه تعداد تقریبی مواردی رو که **list** نگه خواهد داشت می‌دونید، تنظیم ظرفیت اولیه می‌تونه عملکرد رو با کاهش تعداد جابجایی‌های حافظه مورد نیاز در حین رشد **list**، بهبود ببخشه.

73
06:04.410 --> 06:12.060
و بعد باید از حلقه‌های **foreach** هر وقت با **list**ها کار می‌کنید استفاده کنید، زمانی که نیازی به تغییر **list** در طول تکرار ندارید.

74
06:12.060 --> 06:16.170
پس حلقه‌های **foreach** فقط یک سینتکس تمیزتر نسبت به حلقه‌های **for** ارائه می‌دن.

75
06:16.170 --> 06:17.850
حالا بیاید این دو رو با هم مقایسه کنیم.

76
06:17.880 --> 06:20.250
اول از همه انعطاف‌پذیری اندازه.

77
06:20.250 --> 06:22.320
پس **array**ها در اندازه ثابت هستن.

78
06:22.320 --> 06:27.660
به این معنی که وقتی تعداد عناصری رو که می‌تونه نگه داره تعریف می‌کنید، بدون ایجاد یک **array** جدید، قابل تغییر اندازه نیست.

79
06:27.660 --> 06:30.810
**List**ها، از طرف دیگه، می‌تونن اندازه‌شون رو به صورت پویا تنظیم کنن.

80
06:30.810 --> 06:35.310
پس هر وقت به یک مجموعه پویا نیاز دارید، **list**ها راه حل هستن.

81
06:35.490 --> 06:36.660
وقتی صحبت از عملکرد می‌شه.

82
06:36.660 --> 06:44.100
**Array**ها عملکرد کمی بهتری رو ارائه می‌دن، پس برای **indexing** و تکرار، چون ساده‌تر هستن و دسترسی مستقیم به مکان‌های حافظه خودشون دارن.

83
06:44.100 --> 06:53.490
با این حال، **list**ها هم هنوز کاملاً کارآمد هستن و به دلیل تغییر اندازه پویا و سایر ویژگی‌های اضافی که در پس‌زمینه اجرا می‌شن، کمی سربار (overhead) دارن.

84
06:53.490 --> 06:58.440
بعد بحث عملکرد وجود داره، و **array**ها یک ساختار داده ساده برای ذخیره‌سازی و

85
06:58.440 --> 07:00.240
دسترسی به تعداد ثابتی از عناصر ارائه می‌دن.

86
07:00.240 --> 07:06.930
با این حال، **list**ها با متدهای داخلی بسیار بیشتری برای جستجو، مرتب‌سازی و دستکاری داده‌ها همراه هستن، که می‌تونه خیلی اوقات به کار بیاد.

87
07:06.930 --> 07:13.260
پس وقتی صحبت از سهولت استفاده می‌شه، **list**ها عموماً وقتی نیاز به اضافه کردن یا حذف مکرر موارد دارید، راحت‌تر هستن.

88
07:13.260 --> 07:20.250
با این حال، **array**ها وقتی تعداد عناصر از قبل مشخصه و تغییر نمی‌کنه، ترجیح داده می‌شن.

89
07:20.280 --> 07:28.350
اوکی، پس این یک نمای کلی از **array**ها و **list**ها، نحوه مقایسه اون‌ها با یکدیگر و به طور کلی نحوه کار **list**ها رو به شما داد.

90
07:28.350 --> 07:34.410
اما واضحاً ما قراره به تمرین زیاد هم بپردازیم با برخی تمرین‌ها و البته برخی دموها.

91
07:34.410 --> 07:36.360
پس شما رو در ویدیوی بعدی می‌بینم.