
آموزش مباحث پیشرفته کالکشن ها Collection ها در سی شارپ
آموزش مباحث پیشرفته کالکشن ها Collection ها در سی شارپ یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی مباحث پیشرفته کار کردن با کالکشن ها در سی شارپ است که با نام اصلی Advanced C# Collections از شرکت Pluralsight منتشر شده است.
Collection ها چه هستند؟
به منظور استفاده و مدیریت از گروهای از اشیا در برنامه های دات نت می توان آرایه ای از اشیا و یا Collection ی از اشیا را ساخت. کاربرد آرایه ها بیشتر در کار کردن با تعداد مشخصی از اشیا می باشد که همگی از یک نوع یکسان هستند. به عبارت دیگر آرایه ها در دات نت Strongly Typed هستند. از طرف دیگر، Collection ها در کار کردن با مجموعه هایی که تعداد اعضای آنها به صورت پویا کم و یا زیاد می شود استفاده می گردند. علاوه بر این، در بعضی از Collection ها، می توان به هر عنصری کلیدی اختصاص داد که با استفاده از آن کلید، عنصر مورد نظر را سریعاً بازیابی کرد. باید بگوییم که یک Collection در اصل یک کلاس می باشد. بنابراین، برای استفاده از آنها باید یک شی از کلاس مورد نظر را ساخت.
اگر مجموعه ای که قصد کار کردن با آن را دارید شامل عناصری می شود که همگی از یک جنس هستند می توانید از کلاس هایی که در System.Collections.Generic می باشند استفاده کنید. Collection هایی که جنریک هستند به ما امکان اضافه کردن اشیا غیرهمجنس را به مجموعه نمی دهند. علاوه بر این، در زمان بازیابی عنصری از این مجموعه ها نیازی به تشخیص نوع آن عنصر نیست.

ضمناً توصیه می کنیم که از آموزش کلاس های کالکشنی همروند Concurrent Collection ها در سی شارپ و آموزش کلاس های کالکشنی در سی شارپ نیز دیدن کنید.
انتخاب Collection مناسب برای نیازهای برنامهنویسی C#
در C#، انتخاب نوع مناسب Collection میتواند بر خوانایی کد، نحوه مدیریت دادهها و کارایی عملیات مختلف تأثیر بگذارد. برخی مجموعهها برای دسترسی بر اساس اندیس مناسباند، در حالی که برخی دیگر برای جستوجو بر اساس کلید یا نگهداری دادهها با ترتیب مشخص طراحی شدهاند. شناخت تفاوت میان این ساختارها به توسعهدهندگان کمک میکند بهجای انتخاب یک نوع مجموعه برای تمام موقعیتها، نیازهای واقعی برنامه و الگوی استفاده از دادهها را در نظر بگیرند.
هنگام انتخاب یک Collection، باید به عملیاتی که بیشتر انجام میشوند توجه کرد؛ برای مثال، افزودن و حذف عناصر، جستوجو، پیمایش یا بررسی وجود یک مقدار. ساختاری که برای یک نوع عملیات مناسب است، لزوماً در شرایط دیگر بهترین انتخاب نیست. بررسی رفتار مجموعهها و شناخت محدودیتهای آنها به شما کمک میکند کدهای C# را با دقت بیشتری طراحی کنید و از هزینههای غیرضروری در پردازش دادهها جلوگیری کنید.
بررسی کارایی Dictionary و SortedDictionary در C#
کلاسهای Dictionary و SortedDictionary در C# برای نگهداری دادهها بهصورت کلید و مقدار استفاده میشوند، اما رفتار آنها در نگهداری ترتیب عناصر یکسان نیست. Dictionary برای دسترسی بر اساس کلید طراحی شده و ترتیب پیمایش آن نباید بهعنوان ترتیب مرتبشده دادهها در نظر گرفته شود. در مقابل، SortedDictionary عناصر را بر اساس کلید مرتب نگه میدارد و برای موقعیتهایی مناسب است که ترتیب کلیدها بخشی از نیاز برنامه باشد.
انتخاب میان این دو ساختار به نحوه استفاده از دادهها بستگی دارد. اگر دسترسی بر اساس کلید مهمترین نیاز باشد و ترتیب مرتبشده لازم نباشد، Dictionary میتواند انتخاب مناسبی باشد. اما اگر لازم است عناصر هنگام پیمایش بر اساس کلید مرتب باشند، SortedDictionary گزینهای قابلبررسی است. آشنایی با تفاوتهای این مجموعهها به توسعهدهندگان کمک میکند هزینه عملیات مختلف و نیازهای منطقی برنامه را هنگام طراحی ساختار داده در نظر بگیرند.
استفاده از Concurrent Collections در برنامههای چندنخی
در برنامههایی که چند Thread به دادههای مشترک دسترسی دارند، مدیریت همزمانی اهمیت زیادی پیدا میکند. استفاده نادرست از مجموعههای معمولی در چنین شرایطی میتواند به تداخل عملیات یا رفتارهای پیشبینیناپذیر منجر شود. Concurrent Collections در .NET برای سناریوهای دسترسی همزمان طراحی شدهاند و به توسعهدهندگان کمک میکنند برخی عملیات رایج روی دادههای مشترک را با سازوکارهای مناسبتری مدیریت کنند.
انتخاب مجموعه همزمان مناسب به نوع پردازش و الگوی دسترسی Threadها بستگی دارد. برای مثال، در بعضی سناریوها چند بخش از برنامه باید دادهها را بهطور همزمان اضافه یا دریافت کنند، در حالی که در موقعیتهای دیگر عملیات بر اساس کلید انجام میشود. شناخت امکانات و محدودیتهای Concurrent Collections کمک میکند هنگام طراحی برنامههای چندنخی، راهکار متناسبتری انتخاب کنید و از پیچیدگیهای ناشی از هماهنگسازی دستی دسترسی به دادهها بکاهید.
Immutable Collections و مجموعههای فقط خواندنی در C#
در برخی برنامهها لازم است دادهها پس از ایجاد شدن بدون تغییر باقی بمانند یا مصرفکنندگان یک مجموعه امکان تغییر مستقیم آن را نداشته باشند. در .NET، مجموعههای فقط خواندنی و Immutable برای نیازهای متفاوتی به کار میروند. یک مجموعه فقط خواندنی معمولاً امکان تغییر از طریق همان رابط را محدود میکند، اما لزوماً تضمین نمیکند که دادههای زیرین از مسیرهای دیگر تغییرناپذیر باشند. در مقابل، مجموعههای Immutable با هدف حفظ نسخههای تغییرناپذیر دادهها طراحی شدهاند.
شناخت تفاوت این دو رویکرد در طراحی APIها و مدیریت وضعیت برنامه اهمیت دارد. وقتی یک مجموعه در اختیار بخشهای مختلف سیستم قرار میگیرد، محدود کردن امکان تغییر آن میتواند از تغییرات ناخواسته جلوگیری کند و رفتار کد را قابلپیشبینیتر سازد. در سناریوهایی که چند بخش برنامه به یک وضعیت مشترک دسترسی دارند، استفاده از ساختارهای Immutable نیز میتواند به سادهتر شدن مدیریت تغییرات کمک کند؛ البته انتخاب نهایی باید با توجه به نیازهای عملکردی و طراحی برنامه انجام شود.
سرفصل مطالب آموزش ویدئویی مباحث پیشرفته کالکشن (Collection) ها در سی شارپ
فصل اول: مقدمه دوره آموزشی
- مقدمه دوره آموزشی
فصل دوم: کار کردن با آرایه ها، لیست ها و تصاویر کالکشن ها
- مقدمه
- مقایسه تصاویر بین آرایه ها
- بسیاری از کلاس های کالکشنی Reference Type هستند
- تساوی برای کالکشن ها
- مقایسه کردن مقادیر درون کالکشن ها با متد SequenceEqual
- انتصاب آرایهها
- رفتار عجیب آرایهها
- بررسی دقیقتر آرایهها
- بررسی دقیقتر List ها
- جمع بندی
فصل سوم: بررسی عملکرد کلاس های کالکشنی
- مقدمه
- چرا بررسی عملکرد کلاس های کالکشنی مهم است
- عملیات O(n) و مبحث اصلی Scalability
- معنی O(n) چیست؟
- خطرات O(n2)
- بررسی دوباره مقیاسپذیری کالکشن ها
- معرفی برنامه TourBooker
- وارد کردن داده ها به درون یک لیست
- نشان دادن داده های درون یک لیست در یک لیست باکس
- جستجوی خطی با List.Find
- مرتب سازی کردن با List.Sort و مقایسه آن با LINQ
- جمع بندی
فصل چهارم: بررسی دقیقتر دیکشنری ها و Sorted دیکشنری ها
- مقدمه
- ایجاد کردن یک دیکشنری از طریق یک لیست با استفاده از LINQ
- پیدا کردن عناصر درون یک دیکشنری با استفاده از کلید
- حل کردن مشکل حساس بودن به حروف کوچک و بزرگ با استفاده از EqualityComparer
- پیمایش عناصر درون یک دیکشنری
- پیمایش عناصر درون یک دیکشنری و مبحث ترتیب آنها
- معرفی کردن کلاس SortedDictionary جنریک
- بررسی کلاسهای SortedList و SortedDictionary
- استفاده کردن از یک نوع داده ای سفارشی برای Key در یک دیکشنری
- Override کردن قابلیت Equality برای کلید ها
- اهمیت GetHashCode
- جمع بندی
فصل پنجم: تغییر دادن لیست پیوندی با کارایی بالا
- مقدمه
- معرفی کردن کلاس LinkedList جنریک
- تغییرات سریع و جستجوی کند در لیست های پیوندی
- بررسی Node ها و کلاس جنریک LinkedListNode
- اضافه کردن یک گره به آخر لیست پیوندی با متد AddLast
- حذف کردن یک گره از لیست پیوندی با استفاده از متد Remove
- درز کردن یک در لیست پیوندی با استفاده از متد InsertBefore
- مزایا و معایب کلاس جنریک LinkedList
- بررسی دوباره SortedDictionary
- بهرهمند شدن از یکتایی کلیدهای دیکشنری ها
- جمع بندی
فصل ششم: بررسی کلاس Stack
- مقدمه
- معرفی کردن کلاس Stack جنریک
- کار کردن با کلاس Stack در یک مثال واقعی
- قرار دادن عناصر در کلاس Stack با متد Push
- خواندن عناصر از کلاس Stack با استفاده از متد Pop
- پیادهسازی کردن قابلیت Undo
- ویژگی های یک Stack
- جمع بندی
فصل هفتم: بررسی کلاس Queue
- مقدمه
- استفاده کردن از کلاس Queue در یک مثال واقعی
- تعریف کردن Queue
- بررسی پروپرتی SelectedItems در Queue
- قرار دادن عناصر در Queue
- خواندن عناصر در Queue
- انجام عملیات Peek در Queue
- پیشمایش کردن عناصر درون یک Queue
- جمع بندی
فصل هشتم: مباحث مربوط به Concurrency و Collection Concurrent ها
- مقدمه
- اضافه کردن Concurrency به برنامه
- قرار دادن یک عنصر در یکQueue Concurrent
- خواندن یک عنصر از یکQueue Concurrent با استفاده از متد TryDequeue
- استفاده از متد TryPeek برای خواندن یک عنصر از ConcurrentQueue
- جمع بندی
فصل نهم: کار با داده ها و کلاس های HashSet و SortedSet
- مقدمه
- حذف کردن عناصر تکراری با استفاده از LINQ
- جلوگیری کردن از عناصر تکراری با استفاده از کلاس جنریک HashSet
- مقایسه کرده Set ها و Dictionary ها
- مرتب کردن عناصر با کلاس جنریک SortedSet
- لحاظ کردن یک Comparer
- بررسی Comparer ها و Equality Comparer ها
- تلفیق کردن Set ها با استفاده از متد UnionWith
- بررسی متد IntersectWith و اشتراک گرفتن Set ها
- جمع بندی
فصل دهم: بررسی کلاس های کالکشنی فقط خواندنی و Immutable
- مقدمه
- معرفی کردن کلاس جنریک ReadOnlyDictionary
- معرفی کردن کلاس جنریک ReadOnlyList
- استفاده از کلاس های کالکشنی ReadOnly و مزیت آنها
- یک موضوع بسیار مهم در کلاسهای کالکشنی ReadOnly
- کلاس های کالکشنی Immutable
- مقایسه کلاسهای کالکشنی Immutable و ReadOnly
- مبحث همروندی و یا Concurrency
- جمع بندی
فصل یازدهم: بررسی اینترفیس های کالکشن ها
- مقدمه
- بررسی اینترفیس های List و Dictionary
- پیمایش کردن با استفاده از اینترفیس جنریک IEnumerable
- بررسی عملکرد اینترفیس جنریک IEnumerable و LINQ
- چک کردن وجود عناصر با استفاده از متد Any
- مقایسه اینترفیس های جنریک IReadOnlyList و IImmutableList
- Decouple کردن کد
- جمعبندی
- جمعبندی دوره آموزشی







