1
00:00.110 --> 00:06.770
خب در این ویدیو، یک کالکشن قدیمی دیگه برای شما دارم که می‌تونید ببینید، اما اجباری نیست.

2
00:06.770 --> 00:18.500
و فقط در صورتی مرتبط هست که تا به حال از کد قدیمی استفاده کرده باشید یا نیاز به نگهداری کد قدیمی داشته باشید، یا صرفاً پروژه‌های قدیمی رو نگاه می‌کنید که کدهایی با استفاده از **Hash Table** نوشته شده‌اند.

3
00:18.500 --> 00:29.210
این‌ها صرفاً یک نوع کالکشن هستند که جفت **Key-Value** دارن، مشابه چیزی که یک **Dictionary** داره، با این تفاوت که **Dictionary**ها خیلی بهترند چون **Type Safety** دارن،

4
00:29.210 --> 00:35.780
همچنین **Null Key** و **Concurrency** دارن، و این باعث می‌شه **Dictionary**ها در هر صورت انتخاب بهتری باشن.

5
00:35.780 --> 00:38.960
بسیار خب، ما در ویدیوهای بعدی عمیقاً به **Dictionary**ها نگاه خواهیم کرد.

6
00:38.960 --> 00:46.580
اما در حال حاضر، فقط **Hash Table**ها رو تماشا کنید، ریلکس کنید، اگر حوصله‌تون سر رفت، سرعتش رو زیاد کنید، اگر براتون خیلی کنده، یا هر چی.

7
00:46.580 --> 00:48.650
نیازی نیست همزمان کد بزنید یا هر کار دیگه‌ای.

8
00:48.650 --> 00:49.820
فقط از مسیر لذت ببرید.

9
00:49.820 --> 00:53.750
و اگر اصلاً حس تماشای **Hash Table**ها رو ندارید، به ویدیوی بعدی بپرید.

10
00:53.750 --> 00:58.850
پس **Hash Table** و **Dictionary** برخی از مفیدترین کالکشن‌ها در C# هستند.

11
00:58.850 --> 01:01.790
پس می‌بینیم که چطور تعریفشون کنیم و چطور استفاده کنیم.

12
01:01.790 --> 01:04.940
و در چه سناریویی باید ازشون استفاده کنیم.

13
01:04.940 --> 01:09.710
برای درک مفهوم **Hashing** و **Table**ها، ابتدا به یک دیکشنری واقعی فکر کنید.

14
01:09.710 --> 01:19.640
پس فرض کنید ما یک دیکشنری آلمانی به انگلیسی داریم، که در اون هر کلمه در آلمانی فقط با یک کلمه در انگلیسی مطابقت داره، چون این محدودیت اینجا خواهد بود.

15
01:19.640 --> 01:33.080
بنابراین وقتی سعی می‌کنیم کلمه‌ی **"Auto"** رو ترجمه کنیم، که در آلمانی اساساً به **"Car"** ترجمه می‌شه، در انگلیسی از یک کلمه به عنوان کلمه‌ی **Key** استفاده می‌کنیم که مثلاً بتونیم اون رو جستجو کنیم.

16
01:33.080 --> 01:36.110
و یک ترجمه به عنوان نتیجه دریافت می‌کنیم.

17
01:36.110 --> 01:38.450
پس همیشه این رابطه‌ی **"یک به یک"** وجود داره.

18
01:38.450 --> 01:43.040
پس ما **"Auto"** رو داریم و اون به **"Car"** ترجمه می‌شه.

19
01:43.040 --> 01:47.480
و ما دقیقاً می‌تونیم با استفاده از **Hash Table**ها هم به این برسیم.

20
01:47.480 --> 01:52.100
و ما قراره از این در یک مثال خیلی خاص اینجا استفاده کنیم.

21
01:52.100 --> 02:04.640
پس فرض کنید یک سیستم ثبت‌نام دانشجو داریم که در اون هر دانشجو یک **ID** و داده‌های زیادی مثل نام، سن، نمرات، و تصویر و غیره داره.

22
02:04.640 --> 02:10.280
برای اینکه چنین سیستمی کار کنه، به یک **ID** مخصوص برای هر دانشجو نیاز داریم. پس باید منحصر به فرد باشه.

23
02:10.280 --> 02:24.530
اگر قرار بود این داده‌ها رو با استفاده از یک **Hash Table** یا **Dictionary** ذخیره کنیم، **Student ID** حکم **Key** رو داشت و داده‌های دانشجو یک **Object** می‌شد که تمام اطلاعات دیگه دانشجو رو در بر می‌گرفت، و اون **Value** می‌شد.

24
02:24.530 --> 02:28.850
بنابراین ما همیشه این جفت **Key-Value** رو داریم، باشه؟

25
02:28.850 --> 02:33.800
پس این نحوه پیدا کردن داده‌های واقعی، به اصطلاح، هست.

26
02:33.800 --> 02:36.530
و این **Value** هست که پشت اون قرار داره.

27
02:36.530 --> 02:39.170
پس می‌تونید اون رو مثل یک کمد در نظر بگیرید.

28
02:39.170 --> 02:45.680
پس این **ID** کمد یا مکان کمد هست. می‌تونه انواع مختلفی از داده‌ها باشه. لازم نیست **ID** باشه و این **Value** خواهد بود.

29
02:45.680 --> 02:50.390
و این **Value** خواهد بود.

30
02:50.390 --> 02:53.000
پس در **Dictionary** باید از یک نوع باشند.

31
02:53.000 --> 02:57.080
در یک **Hash Table**، می‌تونن از انواع مختلف باشن.

32
02:57.080 --> 03:00.860
پس این می‌تونه یک **Integer** باشه و این می‌تونه مثلاً یک **Object** باشه.

33
03:00.860 --> 03:03.470
پس اول به **Hash Table**ها نگاه می‌کنیم.

34
03:03.470 --> 03:06.890
بنابراین ما قراره یک **Class** جدید ایجاد کنیم.

35
03:06.890 --> 03:10.910
یا در واقع من یک **Class** جدید برای این آماده کرده‌ام.

36
03:10.910 --> 03:12.290
بذارید اینجا پایین بذارمش.

37
03:12.290 --> 03:14.810
و اون چند تا **Property** داره.

38
03:14.930 --> 03:19.130
یک **Property ID**، یک **Property Name** و **GPA** داره.

39
03:19.280 --> 03:22.970
و بعد ما یک **Constructor** خیلی ساده داریم که به سادگی مقدار رو تخصیص می‌ده.

40
03:22.970 --> 03:32.420
بنابراین هر **ID** که هنگام ایجاد **Student Object** به اون پاس بدیم، **ID** اون **Student Object** خواهد بود و الی آخر.

41
03:32.420 --> 03:34.280
باشه، پس چیز فانتزی‌ای اینجا نداریم.

42
03:34.280 --> 03:38.960
فقط داریم از یک **Class** معمولی استفاده می‌کنیم، همونطور که در فصل **Class** پوشش دادیم.

43
03:38.960 --> 03:45.890
حالا البته می‌تونستیم جلو بریم و این **Class** رو در یک فایل جداگانه ایجاد کنیم، پس می‌تونستیم بریم و **Solution Explorer**مون رو باز کنیم.

44
03:45.890 --> 03:51.050
بریم جلو و یک فایل جدید اینجا ایجاد کنیم.

45
03:51.050 --> 03:55.760
پس **Add New Item** یا یک **New Class** مثل این و اون رو **Student** بنامیم.

46
03:55.760 --> 03:59.510
اما برای این مثال من قراره ساده نگهش دارم و اون رو در یک فایل بذارم.

47
03:59.510 --> 04:08.630
همونطور که می‌دونید، بهترین کار اینه که اون رو در یک فایل جداگانه بذارید تا چیزها رو با هم قاطی نکنید. و بتونید فایل‌ها و **Class**ها و همه اینها رو راحت‌تر پیدا کنید.

48
04:08.630 --> 04:16.700
بسیار خب، حالا که **Student Class**مون رو داریم، می‌تونیم جلو بریم و یک **Hash Table** ایجاد کنیم، باشه؟

49
04:16.700 --> 04:24.020
پس داخل **Program** ما در اینجا در **Main Method**، جاییه که من قراره یک **Hash Table** جدید تعریف کنم.

50
04:24.020 --> 04:32.930
و به این شکل خواهد بود، **Hash Table**. و من این رو **Table** می‌نامم که یک **New Hash Table** خواهد بود.

51
04:33.140 --> 04:36.140
**Hash Table Class** داخل **System.Collections** هست.

52
04:36.140 --> 04:41.120
پس ما باید این **Namespace** رو بالا اضافه کنیم: **using System.Collections**.

53
04:41.120 --> 04:55.340
پس **Hash Table** و اون با **Hash Tables Namespace** متفاوته چون من کالکشن خودم رو اونطور نامگذاری کردم که ممکنه IDE ما رو اینجا گیج کنه. اگر بخوایم **Hash Table** رو بدون اضافه کردن این **Namespace** به پروژه‌مون وارد کنیم. اما حالا که اون رو داخل **Program Class**مون داریم، می‌تونیم ازش استفاده کنیم.

54
04:55.340 --> 04:59.480
اما حالا که اون رو داخل **Program Class**مون داریم، می‌تونیم ازش استفاده کنیم.

55
04:59.720 --> 05:07.490
پس ما این **New Hash Table** رو داریم، که حالا یک **Table** از داده‌ها خواهد بود. و ما می‌تونیم داده‌هایی که می‌خوایم رو داخلش قرار بدیم.

56
05:07.490 --> 05:16.550
پس این نحوه ایجاد چنین **Hash Table**ی هست. نحوه مقداردهی اولیه اون با یک **Hash Table Object** خالی، همونطور که اینجا انجام دادیم.

57
05:16.550 --> 05:20.300
خب حالا کاری که می‌تونیم انجام بدیم اینه که می‌تونیم مقادیر رو به این **Hash Table** اختصاص بدیم.

58
05:20.300 --> 05:25.430
و حتی می‌تونیم اون رو **StudentsTable** بنامیم تا کدمون کمی خواناتر بشه.

59
05:25.430 --> 05:31.910
بنابراین ما فقط باید تعدادی دانشجو ایجاد کنیم که می‌خوایم در **Table**مون داشته باشیم.

60
05:31.910 --> 05:40.340
پس بذارید اون‌ها رو هم اینجا اضافه کنم، اون‌ها رو **Student 1، Student 2، Student 3، Student 4** می‌نامم. و همه‌شون **New Student Object** خواهند بود.

61
05:40.340 --> 05:46.670
پس اینجا این دانشجو با **ID 1**، **Maria** خواهد بود. اون یک **GPA** 98 داره.

62
05:46.670 --> 05:54.320
بعد ما **Jason** رو داریم که **ID** یک رو خواهد داشت. این **ID** اینجاست، شناسه منحصر به فرد به اصطلاح.

63
05:54.320 --> 05:58.280
و بعد **GPA** که دانشجوها دارن، باشه.

64
05:58.280 --> 06:06.730
پس حالا ما همه اون دانشجوها رو داریم و می‌تونیم اون‌ها رو به **StudentsTable**مون با استفاده از **Student ID** اختصاص بدیم.

65
06:06.910 --> 06:13.300
و یک روش خوب این خواهد بود که بریم جلو و بگیم **StudentsTable.Add**.

66
06:13.300 --> 06:17.020
و اینجا ما از **Student 1.ID** استفاده می‌کنیم.

67
06:17.260 --> 06:21.160
پس این یکی اینجا، **Property** رو به عنوان **Key** استفاده می‌کنیم.

68
06:21.160 --> 06:29.080
پس می‌تونید اینجا ببینید یک **Hash Table** به ما اجازه می‌ده یک **Key** از نوع **Object** داشته باشیم. پس می‌تونه هر نوع **Object**ی به عنوان **Key** باشه.

69
06:29.080 --> 06:37.150
و می‌تونه یک **Object** اختیاری یا قابل تهی (**Nullable**) به عنوان **Value** باشه. پس می‌تونیم یک **Value** اختصاص بدیم یا می‌تونه **Null** باشه، باشه.

70
06:37.150 --> 06:42.880
اما ما قراره یک **Value** اختصاص بدیم و اون خود **Student 1** خواهد بود، مثل این، باشه.

71
06:42.880 --> 06:48.820
پس حالا ما **Student 1** رو به **StudentsTable**مون اضافه کردیم.

72
06:48.820 --> 06:51.820
و می‌تونیم همین کار رو با دانشجوهای دیگه انجام بدیم.

73
06:51.820 --> 06:55.300
و برای هر کدوم از **ID**شون استفاده می‌کنیم.

74
06:55.300 --> 07:00.040
پس بذارید **StudentsTable** رو اینجا برای همه‌شون استفاده کنیم، باشه.

75
07:00.040 --> 07:02.110
پس حالا این **Hash Table** ماست.

76
07:02.110 --> 07:04.390
اما چطور می‌تونیم ورودی‌ها رو واکشی کنیم؟

77
07:04.390 --> 07:08.110
پس چطور می‌تونیم ورودی‌ها رو از **Hash Table**مون بازیابی کنیم؟

78
07:08.110 --> 07:10.420
خب بیایید به روش‌های مختلفش نگاه کنیم.

79
07:10.420 --> 07:15.670
پس اولین کاری که می‌تونیم انجام بدیم اینه که فقط یک **Student Object** اینجا ایجاد کنیم.

80
07:15.670 --> 07:20.950
پس **Student** و این **Object** **storedStudent** نامیده خواهد شد، باشه.

81
07:20.950 --> 07:28.420
پس من قراره **Student Value** رو از **Table**م بگیرم. پس در این مورد، **Student Table** هست.

82
07:28.420 --> 07:30.970
**StudentsTable** مثل این.

83
07:30.970 --> 07:39.670
و اینجا مشابه نحوه دسترسی به اون در یک **Array**. نحوه دسترسی به یک **Value** در یک **Array**، می‌تونم به اون با یک **ID** دسترسی پیدا کنم.

84
07:39.670 --> 07:45.790
پس اینجا، برای مثال، فرض کنید می‌خوام اون یکی در **ID 1** رو بگیرم، مثل این.

85
07:45.790 --> 07:54.370
پس اینجا مشکل اینجاست که این **Hash Table** می‌تونه **Value**هایی از نوع **Object** داشته باشه، درسته، همونطور که قبلاً دیدیم.

86
07:54.370 --> 08:02.860
پس اینجا اگه بریم جلو و متد **Add** رو فراخوانی کنیم، می‌بینید می‌تونیم یک **Key** اختصاص بدیم. اما بعد **Value** از نوع **Object** خواهد بود.

87
08:02.860 --> 08:17.650
و این به این معنیه که این اینجا از نوع **Object** خواهد بود. اما ما نمی‌تونیم فقط یک نوع **Object** رو به **Student** اختصاص بدیم. باید از نوع **Student** باشه چون این **Stored Student 1** در واقع از نوع **Student** هست، باشه.

88
08:17.650 --> 08:23.530
پس باید مطمئن بشیم که اون رو اینجا به یک **Student** **Cast** می‌کنیم. و بعد این کار می‌کنه. باشه.

89
08:23.800 --> 08:36.370
پس ما داریم این **Object** رو به یک **Student** **Cast** می‌کنیم چون می‌دونیم که داخل **StudentsTable** در موقعیت 1. پس در **ID 1**، **Value** در واقع از نوع **Student** خواهد بود، باشه.

90
08:36.370 --> 08:42.700
پس اینجا می‌تونید **Student** در **ID 1** رو بگیرید. می‌تونید **Student** در **ID 2** رو بگیرید و الی آخر.

91
08:42.700 --> 08:47.080
اما این فقط به این دلیل کار می‌کنه که می‌دونیم در واقع از این اعداد استفاده می‌کنیم.

92
08:47.080 --> 08:57.250
پس اگه بخواید اون رو به روش دیگه بگیرید، می‌تونستید **Stored Student 1** رو با **ID** بگیرید. پس حالا این به شما **Value** پشت **Student 1 ID** رو خواهد داد.

93
08:57.250 --> 09:08.020
پس این اساساً به شما این **Value** اینجا یا این دانشجو رو خواهد داد. و این یکی دقیق‌تره. پس این یکی اینجا چون این چیزیه که ما در این **ID 1** ذخیره می‌کنیم.

94
09:08.020 --> 09:15.370
پس حالا می‌تونیم بریم جلو و کاری مثل این انجام بدیم که در اون حالا به جای نوشتن **"Hello World"**، قراره در واقع یک چیز مفیدی بنویسیم که در اون **Student ID**، **Name** دانشجو،

95
09:15.370 --> 09:22.780
و همچنین **GPA** اون رو می‌نویسیم. پس ما قراره از **StoredStudent1.ID** استفاده کنیم.

96
09:22.780 --> 09:30.160
پس ما **ID** اون، **Name** اون و **GPA** اون رو می‌گیریم. و در این مورد **GPA** اونه و الی آخر چون **Maria** در موقعیت 1 در **ID 1** هست، باشه.

97
09:30.160 --> 09:41.740
پس بیایید این رو اجرا کنیم و می‌بینید **Student ID** یک، **Name** **Maria** و **GPA** 98 هست. پس اینجا دیدیم چطور می‌تونیم یک **Hash Table** ایجاد کنیم.

98
09:41.740 --> 09:47.770
این نحوه ذخیره داده‌ها در **Hash Table** هست. در واقع اینجا جاییه که ما داده‌ها رو در یک **Hash Table** ذخیره می‌کنیم.

99
09:47.770 --> 09:54.880
و بعد این نحوه بازیابی داده‌ها از یک **Hash Table** هست.

100
09:54.880 --> 10:02.480
پس حالا فرض کنیم می‌خوایم در واقع تمام داده‌های داخل **Hash Table**مون رو چاپ کنیم، و ما یک **Key** خاص در دسترس نداریم.

101
10:02.480 --> 10:06.980
می‌تونیم به سادگی این کار رو با گرفتن تمام **Key**ها از **Hash Table**مون انجام بدیم.

102
10:06.980 --> 10:16.010
برای حل این مشکل، ابتدا باید در مورد یک **Struct** به نام **Dictionary Entry** صحبت کنیم. هر وقت ما یک ورودی جدید به **Hash Table**مون اضافه می‌کنیم.

103
10:16.010 --> 10:29.630
پس جفت **Key-Value** ما و یک **New Dictionary Entry Object** برای ما ایجاد خواهد شد، و اون در **Hash Table** ما درج خواهد شد، که به این معنیه که یک **Hash Table** اساساً یک کالکشن از **Dictionary Entry**هاست.

104
10:29.630 --> 10:38.660
پس با استفاده از یک **Temporary Object** از **Dictionary Entry**، می‌تونیم از طریق **Hash Table**مون با استفاده از یک حلقه **For Each** بریم.

105
10:38.660 --> 10:46.940
پس بیایید به این در این مثال خاص اینجا نگاه کنیم که در اون من قراره برم جلو و از یک حلقه **For Each** اینجا استفاده کنم.

106
10:46.940 --> 10:55.880
و این نوع حلقه **For Each** **Dictionary Entry** خواهد بود. این همون **Struct**ی هست که در موردش صحبت می‌کردم. می‌تونید اینجا ببینید **Struct Dictionary Entry**.

107
10:55.880 --> 11:00.560
خب **Item Name** که قراره ازش استفاده کنم چیه. من قراره از **Entry** استفاده کنم.

108
11:00.560 --> 11:07.640
البته می‌تونستید این رو **Student** یا هر چی بنامید چون می‌دونید که ورودی‌ها از نوع **Student** خواهند بود. اما فرض کنید نمی‌دونید.

109
11:07.640 --> 11:17.690
و می‌تونید اون رو **Entry** هم بنامید. و بعد کالکشنی که می‌خوایم این رو از طریق اون اجرا کنیم یا مقادیر رو ازش بگیریم چیه. و اون **StudentsTable** ما خواهد بود.

110
11:17.690 --> 11:24.620
پس این یکی **Individual Item** رو با **ID** شناخته شده بازیابی می‌کنه.

111
11:24.620 --> 11:31.430
و اینجا تمام **Value**ها رو از یک **Hash Table** بازیابی می‌کنه، باشه.

112
11:31.430 --> 11:37.370
پس یک ورودی داخل **Hash Table** ما از نوع **Dictionary Entry** هست، همونطور که گفتم.

113
11:37.370 --> 11:45.740
پس این حالا به ما اجازه می‌ده از طریق این **Table**، **StudentsTable** بریم و اساساً مقادیر رو نمایش بدیم.

114
11:45.740 --> 11:59.570
پس اینجا چون **Entry.Value** یک **Object** رو برمی‌گردونه. می‌تونید اینجا ببینید می‌گه **Object**. اما چیزی که ما برای گرفتن جزئیات دانشجو می‌خوایم، قراره یک **Student Object** باشه.

115
11:59.570 --> 12:02.450
کاری که باید انجام بدیم، اینه که باید کار زیر رو انجام بدیم.

116
12:02.450 --> 12:06.740
پس ما یک **Temporary Value** ایجاد می‌کنیم که **Entry Value** ما خواهد بود.

117
12:06.740 --> 12:15.860
حالا ما همون مشکلی رو داریم که اینجا بالا داشتیم، باشه. که در اون باید این رو به یک **Student** **Cast** کنیم چون اون فقط یک **Object** هست، درسته.

118
12:15.860 --> 12:21.740
اما ما می‌خوایم از نوع **Student** باشه تا بتونیم به **Student Properties** دسترسی داشته باشیم.

119
12:21.740 --> 12:34.040
پس چون در غیر این صورت **Entry Value.ID** اینجا **ID** نداره، نمی‌تونم به **ID** اون دسترسی داشته باشم، نمی‌تونم به **Name** اون دسترسی داشته باشم. همه اون چیزها با وجود اینکه داخلش وجود داره.

120
12:34.040 --> 12:46.580
اما **IDE** ما به سادگی اجازه نمی‌ده چون ابتدا باید مطمئن بشیم که **Value** رو به نوع درست، که قراره نوع **Student** ما باشه، تبدیل یا **Cast** می‌کنیم.

121
12:46.580 --> 12:54.440
پس حالا ما داریم اون رو **Cast** می‌کنیم. داریم اون رو به طور موقت ذخیره می‌کنیم، و حالا می‌تونیم بریم جلو و مقادیر تکی رو در **Console**مون بنویسیم، مثلاً، یا با استفاده از **Program**مون به هر شکلی که می‌خوایم.

122
12:54.440 --> 13:12.770
پس اینجا می‌تونیم از **Student ID** با استفاده از **Temp.ID** استفاده کنیم چون **Temp** حالا از نوع **Student** هست و **Student** **ID** **Name** **GPA** داره، و ما می‌تونیم به همه‌ی اون‌ها دسترسی داشته باشیم تا. حالا از طریق کل لیست تمام دانشجوهای ما پیمایش کنیم.

123
13:12.770 --> 13:14.540
پس بیایید این کار رو سریع انجام بدیم.

124
13:14.540 --> 13:18.110
بیایید کدمون رو اجرا کنیم و ببینیم این حلقه **For Each** برای ما چیکار می‌کنه.

125
13:18.110 --> 13:20.090
پس می‌تونید ببینید از طریق اون می‌ره.

126
13:20.090 --> 13:26.390
می‌گه دانشجو 4 **Steve** هست. دانشجو 3 **Clara** هست، دانشجو 2 **Jason** هست، و 1 **Maria** هست.

127
13:26.390 --> 13:33.140
پس می‌بینید، از آخر به، خب، از آخرین ورودی شروع می‌کنه و تا اولین ورودی می‌ره.

128
13:33.140 --> 13:40.550
حالا اگه در این نقطه ندونیم که آیا دانشجو هست یا نه، با وجود اینکه اینجا ما داریم اون رو از قبل به یک دانشجو تبدیل می‌کنیم.

129
13:40.550 --> 13:47.930
این واقعاً فقط برای اینه که به شما نشون بدیم که یک **Hash Table** واقعاً فقط یک کالکشن از **Dictionary Entry**هاست.

130
13:47.930 --> 13:52.430
پس بیایید ببینیم چطور می‌تونیم این حلقه **For Each** رو ساده‌تر کنیم.

131
13:52.430 --> 14:12.830
می‌تونیم اون رو با در واقع گفتن **For Each** که در اون نوع متغیر قراره یک **Student** باشه، **Item Name**، خب می‌تونید اون رو **Student** بنامید، من فقط قراره اون رو **Value** بنامم مثل این که خوبه. و کالکشنی که می‌خوام از طریق اون برم قراره **Table** باشه، خب **StudentsTable.Values**.

132
14:12.830 --> 14:17.990
پس این **ICollection** از **Hash Table Values** وجود داره.

133
14:17.990 --> 14:29.630
پس این یک **ICollection** رو برمی‌گردونه که شامل مقادیر در **Hash Table** هست. پس این به ما اجازه می‌ده مستقیماً از طریق مقادیر بریم بدون اینکه اساساً مجبور باشیم کاری که اینجا انجام دادیم رو انجام بدیم، که در اون اون رو تبدیل کردیم، یا در اون اون رو به یک **Student Object** **Cast** کردیم.

134
14:29.630 --> 14:37.790
پس حالا می‌تونیم فقط بریم جلو و همون کاری که اینجا انجام دادیم رو انجام بدیم.

135
14:37.790 --> 14:48.710
اما حالا البته، قراره **Value.ID** و الی آخر باشه، چون **Entry** نیست و **Temp** نیست، اما در واقع قراره **Value** باشه، باشه.

136
14:48.710 --> 15:03.150
چون این چیزیه که این حلقه **For Each** برای هر تکرار به ما می‌ده، که از طریق تمام مقادیری که داریم می‌ره و **Value** قراره مقادیر تکی باشه. که در حال حاضر برای اون تکرار خاص بهش نگاه می‌کنیم.

137
15:03.150 --> 15:09.570
پس در اولین تکرار **Steve** خواهد بود، بعد **Clara** خواهد بود، بعد **Jason**، بعد **Maria**.

138
15:09.570 --> 15:18.960
باشه، پس اگه این خط اینجا یا این حلقه **For Each** رو حذف کنیم و دوباره اجراش کنیم، خواهیم دید که همون نتایج رو می‌گیریم.

139
15:18.960 --> 15:22.620
پس **Steve**، **Clara**، **Jason** و **Maria**، باشه.

140
15:22.620 --> 15:26.130
پس این یک معرفی سریع به **Hash Table**ها بود.

141
15:26.130 --> 15:35.010
در ویدیوی بعدی یک چالش کوچک برای شما خواهم داشت که در اون اساساً کد خودتون رو کمی گسترش می‌دید تا **Hash Table**ها رو کمی بهتر درک کنید. و بعد به **Dictionary**ها نگاه خواهیم کرد.