1
00:00.110 --> 00:00.560
بسیار خب.

2
00:00.560 --> 00:06.140
بنابراین در این ویدیو من قراره یک نوع لیست قدیمی (legacy list type) به نام **ArrayList** رو بهتون نشون بدم.

3
00:06.140 --> 00:11.660
و دیگه برای کدهای جدید یا پروژه‌های جدیدی که کار می‌کنید، استفاده از اون توصیه نمی‌شه.

4
00:11.660 --> 00:19.700
اما وقتی روی پروژه‌های قدیمی‌تر کار می‌کنید، احتمال زیادی داره **ArrayList** ببینید و خوبه که حداقل نحوه‌ی کار اون‌ها رو بفهمید.

5
00:19.700 --> 00:30.800
نیازی نیست خودتون از اون‌ها استفاده کنید و واقعاً فقط برای اینه که بدونید وجود دارن و تقریباً چطور کار می‌کنن، تا هر وقت یک پروژه‌ی قدیمی دیدید، گیج نشید که اون چیه.

6
00:30.830 --> 00:33.140
باشه، پس بیایید این ویدیو رو ببینیم.

7
00:33.140 --> 00:41.000
این ویدیویی هست که چند سال پیش ضبط کردم، اما از نظر نحوه‌ی کار همچنان معتبره.

8
00:41.000 --> 00:46.610
باشه، پس بیایید شروع کنیم و بریم جلو و یک **ArrayList** ایجاد کنیم.

9
00:46.610 --> 00:49.850
پس من قراره یک **ArrayList** جدید اینجا ایجاد کنم.

10
00:49.850 --> 00:50.750
اعلامش کنم.

11
00:50.750 --> 00:54.620
بنابراین اعلام کردن یک **ArrayList**.

12
00:54.980 --> 00:59.030
و همونطور که می‌بینید داره خطا می‌ده چون **ArrayList** رو نمی‌شناسه.

13
00:59.030 --> 01:10.730
و ما باید از **System.Collections** استفاده کنیم چون **ArrayList class** داخل **Collections class** هست.

14
01:10.730 --> 01:13.820
همونطور که می‌بینید، **List Interface** رو پیاده‌سازی می‌کنه و الی آخر.

15
01:13.820 --> 01:25.160
پس حالا می‌تونم جلو برم و یک اسم بهش بدم و من قراره ازش استفاده کنم یا اون رو **myArrayList** بنامم که یک **new ArrayList** هست. بنابراین این یک روش برای اعلام کردن یک **ArrayList** هست.

16
01:25.160 --> 01:32.690
و یک روش دیگه اینه که همون اول بگیم چندتا شیء باید داخلش باشه.

17
01:32.690 --> 01:37.910
پس در این مورد من قراره بگم باشه، **myArrayList** فقط باید 100 شیء داشته باشه.

18
01:37.910 --> 01:57.740
این یکی در اینجا یک مقدار نامحدود از شیءها با مقدار نامحدود تعریف شده از شیءها داره، و اون یکی با یک مقدار تعریف شده از شیءها با یک مقدار تعریف شده. بسیار خب.

19
01:57.740 --> 02:04.970
بنابراین حالا بیایید بریم جلو و تعدادی شیء یا المان به **ArrayList** اضافه کنیم.

20
02:04.970 --> 02:07.040
پس **myArrayList.Add**.

21
02:07.130 --> 02:16.130
همونطور که می‌بینید **myArrayList** چندین متد (method)، پروپرتی (property) و متدهای توسعه (extension methods) مختلف داره. بنابراین می‌تونید برخی از اون‌ها رو بررسی کنید.

22
02:16.130 --> 02:22.070
و حتی می‌تونید چیزی مثل **clear** رو ببینید که به سادگی کل **ArrayList** رو پاک می‌کنه. بعد **contains** رو دارید.

23
02:22.070 --> 02:26.360
اون بررسی می‌کنه که آیا چیزی که دنبالش هستید، داخلش هست یا نه و الی آخر.

24
02:26.360 --> 02:29.570
پس تعداد زیادی متد جالب وجود داره و ما تعدادی از اون‌ها رو پوشش خواهیم داد.

25
02:29.570 --> 02:33.020
پس من قراره چیزی اضافه کنم.

26
02:33.020 --> 02:35.270
و همونطور که می‌بینید می‌تونم یک شیء اضافه کنم.

27
02:35.270 --> 02:37.100
و این زیبایی در مورد **ArrayList**هاست.

28
02:37.100 --> 02:49.100
اون‌ها لازم نیست فقط شامل **string**ها باشن یا فقط **int**ها یا فقط چیز دیگه‌ای، اون‌ها می‌تونن شامل **objects** باشن. بنابراین هر چیزی که از هر نوع شیء باشه می‌تونه اینجا استفاده بشه.

29
02:49.100 --> 02:53.540
بنابراین به این معنیه که می‌تونیم **integer**ها رو داخلش ذخیره کنیم. مثلاً مقدار 25.

30
02:53.540 --> 02:58.610
بعد می‌تونیم جلو بریم و **string**ها رو داخلش ذخیره کنیم، چیزی مثل "hello".

31
02:58.790 --> 03:07.670
یا می‌تونیم جلو بریم و **double**ها رو داخلش ذخیره کنیم. مثلاً 13.37 و الی آخر.

32
03:07.670 --> 03:24.080
پس من فقط قراره چند مقدار اضافی اینجا اضافه کنم مثل 13، **myArrayList.Add** و 128. و فقط برای اطمینان یک مقدار دیگه 25.3 خواهد بود.

33
03:24.080 --> 03:26.750
و این ویرگول نیست. این یک نقطه است.

34
03:27.800 --> 03:28.610
بسیار خب.

35
03:28.610 --> 03:34.070
بنابراین حالا کاری که می‌تونم انجام بدم اینه که می‌تونم از برخی **method**ها روی **ArrayList** خودم استفاده کنم.

36
03:34.070 --> 03:37.280
برای مثال می‌تونم از **remove method** استفاده کنم.

37
03:37.280 --> 03:41.180
و در اینجا باید تعریف کنم که چی رو می‌خوام حذف کنم.

38
03:41.180 --> 03:45.830
بنابراین من فقط یک **index** رو حذف نمی‌کنم، دارم می‌گم کدوم شیء رو می‌خوام حذف کنم.

39
03:45.830 --> 03:48.500
پس فرض کنید می‌خوام از شر 13 خلاص شم.

40
03:49.460 --> 03:52.400
پس من فقط از **remove 13** استفاده می‌کنم.

41
03:52.400 --> 04:07.850
این المان با ورودی خاص رو از **ArrayList** یا با مقدار خاص حذف می‌کنه. شاید این بهتر باشه.

42
04:08.900 --> 04:11.300
پس قراره 13 رو از اونجا حذف کنه.

43
04:11.300 --> 04:17.000
پس فرض کنید دو بار 13 داخلش دارم که قراره اینطوری انجام بدم.

44
04:17.000 --> 04:19.490
اون وقت 13 رو از لیستم حذف می‌کنه.

45
04:19.490 --> 04:23.480
حالا مورد بعدی حذف در یک **index** خاصه.

46
04:23.480 --> 04:34.070
پس حذف المان در یک موقعیت یا **index** خاص.

47
04:34.070 --> 04:38.090
و این کار با استفاده از متد **RemoveAt** انجام می‌شه.

48
04:38.090 --> 04:40.550
و می‌تونید ببینید یک **RemoveRange** هم وجود داره.

49
04:40.550 --> 04:44.930
بنابراین می‌تونید به سادگی بگید باشه از اون نقطه می‌خوام دو تا مقدار رو حذف کنم.

50
04:44.930 --> 04:53.930
پس فرض کنید از نقطه‌ی چهار. پس این یکی اینجا می‌خوام دو مقدار رو حذف کنم. بنابراین قراره 128 و 25.3 رو حذف کنه.

51
04:53.930 --> 04:59.840
اما من قراره از **RemoveAt** استفاده کنم و اون یکی در موقعیت صفر رو حذف کنم. بنابراین باید...

52
05:00.170 --> 05:03.020
این یکی رو اینجا حذف یا پاک کنه.

53
05:03.020 --> 05:07.520
پس 25 و حالا چیزی به نام **Count** وجود داره.

54
05:07.520 --> 05:14.510
پس اگه می‌خواید بدونید چندتا شیء داخل **ArrayList**تون هست، می‌تونید از کلمه کلیدی **Count** استفاده کنید.

55
05:14.510 --> 05:19.910
حالا کاری که می‌خوام انجام بدم اینه که اون رو روی **Console** بنویسم. پس من فقط قراره اینطوری ازش استفاده کنم.

56
05:19.910 --> 05:22.700
پس نوشتن **Console Count**.

57
05:23.120 --> 05:23.420
بسیار خب.

58
05:23.420 --> 05:25.940
حالا بریم سراغ یک چیز بسیار جالب.

59
05:26.090 --> 05:31.940
بیایید یک حلقه **foreach** ایجاد کنیم که تمام اشیاء داخل **ArrayList**مون رو بررسی کنه.

60
05:31.940 --> 05:36.890
و من قراره اون رو **object** یا **obj** در **myArrayList** بنامم.

61
05:36.890 --> 05:44.420
و قراره از طریق تک تک اشیاء داخل **ArrayList** من بره. و اون در اون تکرار، **object** خواهد بود.

62
05:44.420 --> 05:51.050
پس کاری که می‌تونیم انجام بدیم اینه که می‌تونیم بررسی کنیم اگه **object** از نوع **int** هست، اون وقت می‌تونیم کدی بنویسیم.

63
05:51.050 --> 05:54.140
پس فرض کنید می‌خوام تمام اعداد رو با هم جمع کنم.

64
05:54.140 --> 05:56.930
و البته نمی‌خوام **string** رو اینجا اضافه کنم.

65
05:56.930 --> 06:01.940
پس من قراره یک **double** جدید **result** ایجاد کنم.

66
06:03.710 --> 06:05.240
یا می‌تونید اون رو **sum** بنامید.

67
06:05.240 --> 06:06.830
شاید **sum** دقیق‌تر باشه.

68
06:06.830 --> 06:08.300
این **sum** خواهد بود.

69
06:08.300 --> 06:16.490
و حالا **sum** من باید **integer** و **double**هایی باشه که داخل **ArrayList** من هستن.

70
06:16.490 --> 06:21.950
اما حالا، چون نمی‌تونم به سادگی یک **integer** رو به یک **double** اضافه کنم، باید اون رو تبدیل کنم.

71
06:21.950 --> 06:33.440
پس من قراره از **Convert.ToDouble** استفاده کنم. و اینجا قراره بگم **obj** چون **object** یک شیء هست یا **obj** یک شیء هست.

72
06:33.440 --> 06:37.430
اون یک **integer** نیست، یک **integer** رو شامل می‌شه، اما از نوع **object** هست.

73
06:37.430 --> 06:41.690
بنابراین می‌تونم اون رو به یک **double** **cast** کنم و به سادگی به یک **double** اضافه کنم.

74
06:41.690 --> 06:45.560
اما اگه یک **double** نیست، باید اون رو به یک **double** تبدیل کنم.

75
06:45.560 --> 06:48.650
پس اگه یک **integer** هست، می‌تونم اون رو به یک **double** تبدیل کنم.

76
06:48.650 --> 06:51.350
پس دارم بررسی می‌کنم آیا یک **integer** هست؟ بله هست. بسیار خب.

77
06:51.350 --> 06:55.610
پس بیایید اون رو به یک **double** تبدیل کنیم و به **sum**مون اضافه کنیم.

78
06:55.610 --> 07:01.280
و اینجا **else if obj** یک **double** هست.

79
07:01.280 --> 07:06.980
پس اگه اینطور بود، اون وقت به سادگی از **sum +=** استفاده کن.

80
07:06.980 --> 07:11.990
و اینجا نمی‌تونی فقط بگی **obj**. همونطور که می‌بینی نمی‌تونم به سادگی شیء رو اضافه کنم.

81
07:11.990 --> 07:18.920
این به این دلیله که این یک **object** هست و یک **double** نیست. و نمی‌تونی به سادگی یک **object** رو به یک **double** اضافه کنی، همونطور که گفتم.

82
07:18.920 --> 07:21.920
پس کاری که باید اینجا انجام بدی، استفاده از **Casting** هست.

83
07:21.920 --> 07:29.570
پس در اینجا قراره بگم می‌خوام اون شیء رو به یک **double** **cast** کنم. و اگه این کار انجام شد، لطفاً اون رو به **sum** اضافه کن.

84
07:29.570 --> 07:31.490
و حالا در نهایت **else**.

85
07:31.490 --> 07:38.090
و اینجا می‌تونستم البته بررسی کنم اگه **obj** **string** هست.

86
07:38.090 --> 07:44.900
پس اگه اینطور بود، اون وقت به سادگی اون رو روی **Console** بنویس. پس فقط **obj** رو بنویس. بسیار خب.

87
07:44.900 --> 07:51.470
حالا بیایید **Console** رو بنویسیم یا از **Console** استفاده کنیم تا ببینیم نتیجه چی بوده.

88
07:51.710 --> 07:55.760
نتیجه (result) و نه با حرف بزرگ.

89
07:55.760 --> 07:57.440
و در واقع من اون رو **sum** نامیدم.

90
07:57.770 --> 08:03.890
و در نهایت **Console.ReadKey**.

91
08:05.180 --> 08:06.410
حالا بیایید اجراش کنیم.

92
08:06.410 --> 08:11.600
و همونطور که می‌بینید ما 5 رو می‌گیریم. ما "hello" و 179.67 رو می‌گیریم.

93
08:11.600 --> 08:13.280
پس این اعداد چی هستن؟

94
08:13.280 --> 08:21.140
این 5، تعداد المان‌های داخل **ArrayList** منه. پس اینجا می‌گه **count** و **count** برابر با 5 هست.

95
08:21.140 --> 08:26.600
اگه اینجا بررسی کنیم چندتا مقدار داشتیم. خب ما 7 تا داشتیم 1 2 3 4 5 6 7.

96
08:26.600 --> 08:32.480
و ما 13 رو حذف کردیم و صفر رو حذف کردیم.

97
08:32.480 --> 08:35.270
پس حالا بیایید بررسی کنیم که آیا 13 هنوز داخلش هست یا نه.

98
08:35.270 --> 08:46.160
پس اگه ما اون 13.37 رو بگیریم و 128 و 25.3 رو به اضافه 13 کنیم، همونطور که می‌بینید این نتیجه رو به ما می‌ده.

99
08:46.160 --> 08:52.790
پس حذف **remove 13** المان با یک مقدار خاص رو حذف کرد.

100
08:52.790 --> 08:56.990
پس یک المان رو حذف کرد و نه همه اون‌ها رو، همونطور که اینجا می‌بینید.

101
08:56.990 --> 09:01.010
پس داره یک 13 رو حذف می‌کنه و فقط داره اولین 13 رو حذف می‌کنه.

102
09:01.010 --> 09:03.380
پس بیایید اون رو کپی کنیم و دوباره اجرا کنیم.

103
09:03.380 --> 09:05.660
و حالا 13 رو دو بار حذف خواهد کرد.

104
09:05.660 --> 09:08.990
و همونطور که می‌بینید این مقدار 166 رو می‌گیریم.

105
09:08.990 --> 09:11.720
پس هنوز یک 13 داخلش بوده.

106
09:11.720 --> 09:14.780
پس بیایید دوباره اجراش کنیم وقتی که هیچ 13ای داخلش نیست.

107
09:14.780 --> 09:17.570
و همونطور که می‌بینید همه چیز خوبه.

108
09:17.570 --> 09:20.330
پس سعی کرد چیزی رو حذف کنه. اما چیزی نبود.

109
09:20.330 --> 09:32.360
پس اگه چیزی نیست، همونطور که می‌بینید هیچ کاری انجام نمی‌ده. با وجود اینکه ما سه بار سعی کردیم این 13 رو حذف کنیم یا 13 رو پاک کنیم و دیگه هیچ 13ای داخلش نبود. بسیار خب.

110
09:32.360 --> 09:35.810
پس این یک شروع کوچیک به **ArrayList** بود.

111
09:35.810 --> 09:39.470
و همونطور که می‌بینید چیزهای زیادی در مورد **ArrayList**ها وجود داره که باید بدونید. و اون‌ها خیلی باحالن.

112
09:39.470 --> 09:45.140
و در ویدیوی بعدی قراره بریم جلو و حتی از متدهای بیشتری از **ArrayList class** استفاده کنیم.

113
09:45.380 --> 09:52.430
اما قبل از اون، دوست دارم سریع در مورد چیزی که صحبت نکردم، یعنی این **object** اینجا، صحبت کنم.

114
09:52.430 --> 10:02.230
پس چرا من اینجا از **object** در **ArrayList** خودم استفاده می‌کنم به جای، مثلاً **ArrayList** به عنوان نوع داده؟ یا حتی **integer** یا **string**.

115
10:02.230 --> 10:08.350
خب، من اینجا از **object** استفاده می‌کنم چون **object** بالاترین سطح **class**ی هست که وجود داره.

116
10:08.350 --> 10:13.150
هر **class** دیگه‌ای به نوعی داره از اون **class object** به ارث می‌بره.

117
10:13.150 --> 10:21.100
به همین دلیله که می‌تونیم اینجا از **object** استفاده کنیم، چون هر نوع داده‌ی متفاوتی که داخل **ArrayList** من باشه با این کار خواهد کرد.

118
10:21.100 --> 10:28.150
چون اگه به **ArrayList**مون نگاه کنیم، یک **integer** داریم. اینجا یک **string** داریم. بعد یک **double** داخلش داریم.

119
10:28.150 --> 10:30.340
پس ما سه نوع داده‌ی متفاوت داخلش داریم.

120
10:30.340 --> 10:38.680
و ما نمی‌تونیم فقط بگیم باشه **object** یا این **obj** قراره یک **integer** باشه، یا قراره یک **string** یا یک **double** باشه.

121
10:38.680 --> 10:42.220
چون این درست نخواهد بود، چون اون همه‌ی اون چیزهاست.

122
10:42.220 --> 10:45.220
درسته. و **object** به سادگی این رو مدیریت می‌کنه.

123
10:45.220 --> 10:50.800
بنابراین اگه از این رویکرد استفاده کنیم، اون به اندازه‌ی کافی باهوش خواهد بود که بفهمه، باشه.

124
10:50.920 --> 10:58.450
در صورتی که یک **integer** نیست، اون رو مدیریت می‌کنه و به **sum** اضافه می‌کنه.

125
10:58.450 --> 11:01.540
در غیر این صورت اگه یک **double** باشه به **sum** اضافه می‌کنه.

126
11:01.540 --> 11:04.330
اما اگه یک **string** باشه، به سادگی **string** رو چاپ می‌کنه. بسیار خب.

127
11:04.330 --> 11:07.180
من فقط می‌خواستم مطمئن شم که این کاملاً واضحه.

128
11:07.180 --> 11:10.120
به همین دلیله که این قسمت کوچک رو به ویدیو اضافه کردم.

129
11:10.120 --> 11:23.290
اگه سوال دیگه‌ای دارید که احساس می‌کنید به خوبی توضیح داده نشده، لطفاً در بخش پرسش و پاسخ به من اطلاع بدید و من دستورالعمل‌ها یا توضیحات اضافی رو به درس‌ها اضافه خواهم کرد.

130
11:23.290 --> 11:23.770
بسیار خب.

131
11:23.770 --> 11:25.450
پس شما رو در ویدیوی بعدی می‌بینم.