1
00:00.110 --> 00:00.950
خوش آمدید.

2
00:00.950 --> 00:07.400
در این ویدیو، می‌خوام به شما نشون بدم که چطور می‌تونید آیتم‌ها رو بر اساس یک شرط **فیلتر** کنید.

3
00:07.400 --> 00:10.100
و به همین دلیل از **LINQ** استفاده خواهیم کرد.

4
00:10.100 --> 00:14.870
پس در اینجا بالا می‌تونید ببینید که **Generics** رو دارید.

5
00:14.870 --> 00:19.130
یعنی **System.Collections.Generic**. این به ما اجازه می‌ده که اصلاً از **List**ها استفاده کنیم.

6
00:19.130 --> 00:26.570
و بعد **LINQ** هست که به ما اجازه می‌ده از **List**ها به روش کارآمدتر، یا به طور کلی از داده‌ها به روش بسیار کارآمد استفاده کنیم.

7
00:26.570 --> 00:29.120
و من به شما نشون می‌دم که چطور کار می‌کنه.

8
00:29.120 --> 00:34.550
پس من این **List** از آیتم‌ها رو اینجا دارم که شامل موز، سیب، گیلاس و توت هست.

9
00:34.550 --> 00:39.050
و حالا چیزی که می‌خوام بفهمم، تمام محصولاتی هستن که ارزان قیمت هستن.

10
03:39.050 --> 00:42.230
پس هر چیزی که می‌تونم زیر یک دلار بگیرم، مثلاً.

11
00:42.230 --> 00:43.640
خب چطور باید این کار رو انجام بدم؟

12
00:43.640 --> 00:48.830
خب قضیه اینه که می‌تونم از چیزی به نام **products.Where** استفاده کنم.

13
00:48.830 --> 00:55.430
پس این کلمه کلیدی **Where** وجود داره که یک توالی از مقادیر رو بر اساس یک **Predicate** فیلتر می‌کنه.

14
00:55.430 --> 00:57.530
پس دوباره این موضوع **Predicate** رو داریم.

15
00:57.530 --> 01:06.260
خب قضیه اینه که این **Predicate** همون چیزی خواهد بود که قبلاً دیده‌ایم، که در اون فقط یک **Lambda Expression** پاس می‌دیم.

16
01:06.260 --> 01:10.130
پس بذارید نشونتون بدم که این چکار می‌کنه یا چطور کار می‌کنه.

17
01:10.130 --> 01:21.890
پس می‌تونم فقط بگم **p** و بعد **lambda**: **p** تبدیل می‌شود به **p.Price** بزرگتر یا کوچکتر از... من می‌گم کوچکتر از **1.0**.

18
01:21.890 --> 01:31.910
و این اینجا یک **IEnumerable** رو **return** می‌کنه که می‌تونیم اون رو به یک **List** تبدیل کنیم.

19
01:31.910 --> 01:39.920
پس می‌تونم جلو برم و اون رو به یک **List** به این شکل تبدیل کنم، بدون این **foreach**.

20
01:39.920 --> 01:42.950
پس این به خودی خود یک عبارت معتبره.

21
01:42.950 --> 01:45.890
با این حال، ما هنوز اون رو در **List** ذخیره نکردیم.

22
01:45.890 --> 01:47.960
پس بیایید یک **List** دیگه اینجا اضافه کنیم.

23
01:47.960 --> 01:54.800
پس قراره اون رو یک **List** از **Product**ها کنیم که من این رو **cheapProducts** (محصولات ارزان) می‌نامم.

24
01:54.800 --> 02:01.790
و من قراره هر چیزی که نتیجه این خط هست رو ذخیره کنم. پس اتفاقات زیادی در این خط در حال رخ دادن هست.

25
02:01.790 --> 02:04.130
پس بیایید اون رو قدم به قدم بشکافیم.

26
02:04.130 --> 02:14.300
پس داریم می‌گیم: **Product**ها رو به من بده **Where** (جایی که) این شرط برآورده می‌شه، اساساً جایی که این شرط برآورده می‌شه.

27
02:14.300 --> 02:17.780
پس این **p** اینجا یک **Product** هست.

28
02:17.780 --> 02:21.170
پس می‌تونید نشانگر رو روش نگه دارید و می‌تونید ببینید که حتی می‌گه **Product p**.

29
02:21.260 --> 02:36.230
پس این **Where clause** (عبارت Where) به ما یک **Product** خواهد داد چون داریم از اون روی **Product List** استفاده می‌کنیم، اوکی. پس **products** یک **List** از آیتم‌های **Product** مجزا هست.

30
02:36.230 --> 02:47.240
پس اگه دارم از این **Where clause** استفاده می‌کنم و از یک **Predicate** استفاده می‌کنم، این **Where clause** به عنوان یک پارامتر، خود **Product** رو به من خواهد داد. پس **p** حالا همون **Product** هست.

31
02:47.240 --> 02:52.670
بعد دارم می‌گم: اوکی، **p**هایی رو به من بده که **p.Price**...

32
02:52.670 --> 02:54.080
پس **p.Price**.

33
02:54.080 --> 03:04.040
و چرا **Price** رو دریافت می‌کنیم؟ خب چون **p**. پس **Product class** این **Price property** رو داره. این یکی همینجاست، این **Price property**.

34
03:04.040 --> 03:08.000
و اینجا می‌بینید که قیمت‌های متفاوتی برای هر آیتم داریم.

35
03:08.000 --> 03:14.720
و من فقط دارم می‌گم: **p**هایی رو به من بده که **Price**شون کمتر از **1.0** هست.

36
03:14.720 --> 03:18.620
حالا این به خودی خود یک **List** رو **return** نخواهد کرد.

37
03:18.620 --> 03:22.670
اون یک چیزی به نام **IEnumerable** رو **return** خواهد کرد.

38
03:22.820 --> 03:35.570
**IEnumerable**ها چیزی برای یک نقطه زمانی بعدی هستن، اما کاری که به ما اجازه می‌ده انجام بدیم اینه که به ما اجازه می‌ده با این متد به نام **ToList** از اون یک **List** بسازیم.

39
03:35.570 --> 03:42.950
پس **IEnumerable**ها یک روش حتی انعطاف‌پذیرتر، کلی‌تر از **List**ها هستن.

40
03:42.950 --> 03:44.990
پس انواع مختلفی از **List**ها وجود داره.

41
03:44.990 --> 03:49.820
ما **Arrays** رو دیده‌ایم، **List**ها رو دیده‌ایم. انواع دیگری از **Collections** وجود داره.

42
03:49.820 --> 03:57.200
اونها **List** نامیده نمی‌شن، اما همه اونها تا حدی **Collections** نامیده می‌شن. درسته. پس ما انسان‌ها اونها رو **List** می‌نامیم. اما در کدنویسی، اونها **Collections** نامیده می‌شن.

43
03:57.200 --> 04:02.150
پس انواع مختلفی از **Collections** وجود داره. **List**ها و **Arrays** فقط دو نوع از اونها هستن.

44
04:02.150 --> 04:11.210
**IEnumerable**ها یک نوع از **List** هستن که حتی کلی‌تره، که به اصطلاح توانایی بیشتری داره.

45
04:11.210 --> 04:13.610
پس یک **List** از نوع **A** هست؟

46
04:13.610 --> 04:27.350
خب، یکی از انواع **IEnumerable**ها واضحاً کمی پیچیده‌تر از اینه چون **IEnumerable** یک **interface** هست و الی آخر. اما این چیزیه که وقتی واقعاً برنامه‌نویسی شی‌ءگرا، بخش سوم، رو درک کردیم، پوشش خواهیم داد، اوکی.

47
04:27.350 --> 04:47.480
پس در این مرحله کاری که می‌تونیم انجام بدیم، اینه که می‌تونیم فقط بگیم، اوکی، پس چیزی که داری **return** می‌کنی یک **IEnumerable**ِ هر چیزی هست. من نمی‌دونم اون چیه، اما می‌دونم که می‌تونم **IEnumerable**ها رو به **List**ها تبدیل کنم و می‌تونم اونها رو داخل **List** **objects** ذخیره کنم. پس داخل این متغیر **cheapProducts** که از نوع **List<Product>** هست.

48
04:47.480 --> 04:59.840
چون این اینجا یک **List** از **Product** هست چون ما اون رو به یک **List** تبدیل کردیم بعد از اینکه یک **Enumerable** از نوع **Product** بود. پس حالا از اون یک **List** از نوع **Product** ساختیم و حالا این **cheapProducts**...

49
05:00.210 --> 05:07.110
**List** حالا تمام محصولاتی رو که ارزان‌تر از قیمت داده شده هستن، شامل خواهد شد.

50
05:07.110 --> 05:13.980
پس حالا کاری که می‌تونیم انجام بدیم اینه که می‌تونیم فقط بگیم، تمام **cheapProducts** رو به من بده و اونها رو چاپ کن.

51
05:13.980 --> 05:23.640
پس کاری که قراره انجام بدم اینه که این **foreach loop** رو تغییر می‌دم، جایی که می‌گم: "محصولات موجود با قیمت کمتر از 1 دلار".

52
05:23.640 --> 05:34.380
و اینجا، به جای اینکه از طریق **products list** برم، قراره از طریق **cheapProducts list** برم، که این **List** جدیده که ما با **Where clause** فیلتر کردیم.

53
05:34.380 --> 05:50.910
و حالا بذارید دوباره این رو اجرا کنم و خواهیم دید که **cheap products** سیب با 0.8 دلار و موز با 0.3 دلار هستن، و این تقریباً یک بخش از **LINQ** هست.

54
05:50.910 --> 05:58.770
پس این چیز اینجا، این **LINQ** اینجا، اگه وارد... راستی، دیدن این بسیار جالبه.

55
05:58.770 --> 06:14.070
پس اگه وارد **directives** خودتون بشید، می‌تونید اینجا کلیک کنید. وقتی در بالای فایل خودتون هستید، می‌تونید روی هر کدوم از اونها کلیک کنید و به این فایل تولید شده خودکار به نام **ListApp.global.using.drugs** می‌رسید.

56
06:14.070 --> 06:42.840
پس چیزی که اینجا می‌تونید ببینید اینه که ما داریم از **namespace** یا **directive** به نام **System** استفاده می‌کنیم. ما داریم از **Collections.Generic** استفاده می‌کنیم و داریم از **LINQ** استفاده می‌کنیم. در حال حاضر ما از **HttpClient**, **threading**, **tasks**, **input/output** استفاده نمی‌کنیم. ما از هیچ کدوم از اونها استفاده نمی‌کنیم. ما فقط داریم از این سه تا استفاده می‌کنیم: **LINQ**, **Collections.Generic** و **System**؛ **System** چیزیه که برای هر چیزی بهش نیاز داریم، درسته؟ بدون **System** نمی‌تونیم کاری انجام بدیم.

57
06:42.840 --> 06:47.520
این **Collections.Generic** به ما اجازه می‌ده که از **List**های خودمون استفاده کنیم.

58
06:47.520 --> 06:47.880
اوکی.

59
06:47.880 --> 06:54.570
پس این **List** اینجا بخشی از **Collections.Generic** هست. پس می‌تونید اون رو اینجا ببینید **System.Collections.Generic**.

60
06:54.570 --> 06:58.050
حالا این **Where clause** از کجا میاد؟

61
06:58.050 --> 07:11.580
خب اگه روی اون کلیک کنید، می‌فهمید که زیر **namespace** **System.Linq** قرار داره. پس **LINQ** این چیزها به نام **IEnumerable**ها رو نگه می‌داره که این کلمه کلیدی رو قبلاً دیده‌ایم. درسته؟ فقط یک دقیقه یا دو دقیقه پیش.

62
07:11.580 --> 07:19.290
و در اونجا این **Where clause** رو دارید. اینجاست که این متد **Where** از اونجا میاد.

63
07:19.290 --> 07:24.870
اما اتفاقات زیادی اینجا در حال رخ دادنه. انگار که وای، چه خبره. خیلی چیزها.

64
07:24.870 --> 07:34.140
خب قضیه اینه که نگرانش نباشید. در پایان دوره، همه اون چیزها رو خواهید فهمید، اوکی؟ اما در حال حاضر تنها چیزی که باید بدونیم اینه که چطور از اون استفاده کنیم.

65
07:34.140 --> 07:40.110
بعداً، حتی بیشتر خواهیم فهمید که زیر کاپوت چطوره، اما هنوز به اونجا نرسیدیم.

66
07:40.110 --> 07:45.870
اوکی، پس به طور کلی، حالا می‌فهمید که در کجا قرار داریم.

67
07:45.870 --> 07:57.780
ما داریم برای اولین بار از **LINQ** استفاده می‌کنیم، و می‌دونم کمی زوده، اما **LINQ** رو بعداً با جزئیات بیشتری پوشش خواهیم داد چون این واقعاً وقتی با **Databases** کار می‌کنید، مهمه.

68
07:58.050 --> 08:00.330
واقعاً مهمه، یک ابزار فوق‌العاده مفید.

69
08:00.330 --> 08:01.200
اوکی.

70
08:01.200 --> 08:21.510
اما فعلاً می‌دونید چطور می‌تونید **List**های خودتون رو حتی با آیتم‌های پیچیده فیلتر کنید، درسته؟ نه فقط چیزی ساده مثل **Int**ها یا **Double**ها یا حتی **String**ها، بلکه با انواع داده واقعی که خودمون ایجاد کردیم با چندین **Property** از انواع داده متفاوت.

71
08:21.660 --> 08:25.500
اوکی، پس برای اینکه تا اینجا پیش رفتید، تبریک می‌گم.

72
08:25.500 --> 08:27.870
و می‌گم شما رو در ویدیوی بعدی می‌بینم.