در حال بارگذاری...

مرجع کالکشن‌ها

در سی‌شارپ، مرجع کالکشن‌ها مجموعه‌ای از ساختارهای داده است که امکان ذخیره‌سازی، مدیریت و دسترسی به داده‌ها به‌صورت دینامیک و مؤثر را فراهم می‌کند. استفاده از کالکشن‌ها در توسعه نرم‌افزار اهمیت زیادی دارد، زیرا به توسعه‌دهندگان اجازه می‌دهد تا داده‌ها را به‌صورت منظم نگهداری کرده، الگوریتم‌های پیچیده را پیاده‌سازی کنند و برنامه‌هایی با معماری شی‌ءگرا و مقیاس‌پذیر بسازند. این ساختارها در پروژه‌های بزرگ مانند سیستم‌های بانکی، فروشگاه‌های آنلاین، مدیریت کاربران و برنامه‌های بلادرنگ بسیار کاربردی هستند.
مرجع کالکشن‌ها در سی‌شارپ شامل انواع کلیدی مانند List، Dictionary\، Queue، Stack و HashSet می‌شود که هرکدام برای سناریوهای خاصی مانند دسترسی سریع، ذخیره‌سازی یکتا یا مدیریت داده‌ها به صورت صف و پشته بهینه شده‌اند. استفاده از این کالکشن‌ها نیازمند درک مفاهیمی چون جنریک‌ها، اینترفیس‌ها (IEnumerable، ICollection، IList)، LINQ و اصول شی‌ءگرایی مانند انکپسولاسیون و چندریختی است.
با مطالعه این مرجع، خواننده می‌آموزد چگونه کالکشن مناسب را برای هر وظیفه انتخاب کند، الگوریتم‌های مؤثر پیاده‌سازی نماید، خطاها و استثناها را مدیریت کند، از نشت حافظه جلوگیری کرده و عملکرد برنامه را بهینه کند. همچنین بهترین شیوه‌ها و تکنیک‌های پیشرفته‌ی گردش در کالکشن‌ها ارائه شده تا توسعه‌دهندگان بتوانند سیستم‌های قوی، قابل نگهداری و با کارایی بالا بسازند.

مثال پایه

text
TEXT Code
using System;
using System.Collections.Generic;

namespace CollectionsReferenceExample
{
class Program
{
static void Main(string\[] args)
{
// ایجاد یک لیست از رشته‌ها
List<string> میوه‌ها = new List<string> { "سیب", "موز", "گیلاس" };

// اضافه کردن یک عنصر جدید
میوه‌ها.Add("پرتقال");

// تغییر یک عنصر موجود
میوه‌ها[1] = "انبه";

// پیمایش عناصر
Console.WriteLine("لیست میوه‌ها:");
foreach (string میوه in میوه‌ها)
{
Console.WriteLine(میوه);
}

// بررسی وجود یک عنصر
if (میوه‌ها.Contains("گیلاس"))
{
Console.WriteLine("گیلاس در لیست موجود است.");
}
}
}

}

در مثال بالا، یک List برای نگهداری رشته‌ها ایجاد شده است. با استفاده از متد Add، می‌توان به‌طور دینامیک عناصر جدید را اضافه کرد. با دسترسی مستقیم به اندیس‌ها مانند میوه‌ها[1] = "انبه"، امکان تغییر مقدار یک عنصر فراهم می‌شود. حلقه foreach برای پیمایش امن و بدون خطای دسترسی به اندیس‌های نامعتبر استفاده شده است. متد Contains بررسی می‌کند که آیا یک عنصر در کالکشن موجود است یا خیر.
این الگو برای کاربردهای واقعی مانند مدیریت فهرست محصولات، کاربران یا داده‌های موقتی حافظه قابل استفاده است. این مثال همچنین نشان‌دهنده اصول شی‌ءگرایی مانند انکپسولاسیون و مدولار بودن است و با توجه به مدیریت حافظه خودکار CLR، نیازی به آزادسازی دستی منابع نیست. درک این عملیات پایه برای ساخت برنامه‌های مقیاس‌پذیر و بهینه ضروری است.

مثال کاربردی

text
TEXT Code
using System;
using System.Collections.Generic;

namespace AdvancedCollectionsExample
{
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

class Program
{
static void Main(string[] args)
{
// ایجاد یک دیکشنری با کلیدهای یکتا
Dictionary<int, Person> افراد = new Dictionary<int, Person>();

افراد.Add(1, new Person { Name = "علی", Age = 30 });
افراد.Add(2, new Person { Name = "مینا", Age = 25 });
افراد.Add(3, new Person { Name = "کامران", Age = 35 });

// دسترسی امن به عناصر
if (افراد.TryGetValue(2, out Person یافت‌شده))
{
Console.WriteLine($"شخص یافت‌شده: {یافت‌شده.Name}, {یافت‌شده.Age} سال");
}

// پیمایش دیکشنری
foreach (var entry in افراد)
{
Console.WriteLine($"ID: {entry.Key}, Name: {entry.Value.Name}");
}

// حذف یک عنصر
افراد.Remove(3);
}
}

}

Advanced سی‌شارپ Implementation

text
TEXT Code
using System;
using System.Collections.Generic;
using System.Linq;

namespace EnterpriseCollectionsExample
{
class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}

class Program
{
static void Main(string[] args)
{
try
{
// HashSet برای جلوگیری از عناصر تکراری
HashSet<Product> محصولات = new HashSet<Product>(new ProductComparer())
{
new Product { Name = "لپ‌تاپ", Price = 1200 },
new Product { Name = "تبلت", Price = 450 },
new Product { Name = "لپ‌تاپ", Price = 1200 } // تکراری نادیده گرفته می‌شود
};

// LINQ برای فیلتر و مرتب‌سازی
var محصولاتگران = محصولات
.Where(p => p.Price > 500)
.OrderByDescending(p => p.Price)
.ToList();

foreach (var p in محصولاتگران)
{
Console.WriteLine($"محصول: {p.Name}, قیمت: {p.Price}");
}
}
catch (Exception ex)
{
Console.WriteLine($"خطا: {ex.Message}");
}
}
}

class ProductComparer : IEqualityComparer<Product>
{
public bool Equals(Product x, Product y)
{
return x.Name == y.Name && x.Price == y.Price;
}

public int GetHashCode(Product obj)
{
return obj.Name.GetHashCode() ^ obj.Price.GetHashCode();
}
}

}

مثال‌های پیشرفته نشان‌دهنده استفاده از Dictionary\ برای دسترسی سریع، HashSet برای یکتایی عناصر و LINQ برای فیلتر و مرتب‌سازی هستند. کلاس ProductComparer معیار مقایسه سفارشی را تعریف می‌کند. بهترین شیوه‌ها شامل مدیریت استثناها، استفاده از جنریک‌ها برای اطمینان از نوع داده و بهینه‌سازی با LINQ است. انتخاب مناسب کالکشن برای هر سناریو ضروری است: List برای داده‌های مرتب، Dictionary\ برای جستجوی سریع و HashSet برای جلوگیری از تکرار. درک این مفاهیم منجر به ایجاد برنامه‌های قوی، مدولار و مقیاس‌پذیر می‌شود.

بهترین شیوه‌ها در سی‌شارپ شامل استفاده از کالکشن‌های جنریک، انتخاب ساختار داده مناسب، پیمایش امن با foreach، کاهش حلقه‌های تو در تو و مدیریت استثناها به‌صورت مناسب است. برای جلوگیری از نشت حافظه، باید به حذف مراجع غیرضروری و بررسی عملکرد با کالکشن‌های بزرگ توجه کرد. در برنامه‌های چند نخی، توصیه می‌شود از کالکشن‌های همزمان (Concurrent) استفاده شود. بهینه‌سازی می‌تواند شامل LINQ کارآمد و Comparerهای سفارشی باشد. ملاحظات امنیتی شامل اعتبارسنجی داده‌ها قبل از افزودن و محافظت از کالکشن‌های مشترک بین نخ‌ها است.

📊 مرجع کامل

سی‌شارپ Element/Method Description Syntax Example Notes
List<T> لیست دینامیک مرتب List<int> numbers = new List<int>(); numbers.Add(10); دسترسی ایندکسی، تغییر اندازه خودکار
List<T>.Add() افزودن عنصر numbers.Add(10); numbers.Add(5); O(1) متوسط
List<T>.Remove() حذف عنصر numbers.Remove(10); numbers.Remove(5); True در صورت حذف
List<T>.Contains() بررسی وجود عنصر numbers.Contains(10); bool exists = numbers.Contains(5); جستجوی خطی
List<T>.Count تعداد عناصر numbers.Count int total = numbers.Count; به‌روز رسانی خودکار
Dictionary\<TKey,TValue> کلید-مقدار Dictionary\<int,string> dict = new Dictionary\<int,string>(); dict.Add(1,"علی"); دسترسی سریع
Dictionary\<TKey,TValue>.Add() افزودن زوج dict.Add(1,"علی"); dict.Add(2,"مینا"); خطا در صورت تکراری بودن کلید
Dictionary\<TKey,TValue>.TryGetValue() دسترسی امن dict.TryGetValue(2,out string val); bool found = dict.TryGetValue(1,out string name); جلوگیری از استثنا
Dictionary\<TKey,TValue>.Remove() حذف زوج dict.Remove(1); dict.Remove(2); True در صورت حذف
Dictionary\<TKey,TValue>.Keys کلیدها var keys = dict.Keys; foreach(var key in dict.Keys) خواندنی فقط
Dictionary\<TKey,TValue>.Values مقدارها var values = dict.Values; foreach(var val in dict.Values) خواندنی فقط
Queue<T> صف FIFO Queue<int> q = new Queue<int>(); q.Enqueue(10); First-In-First-Out
Queue<T>.Enqueue() افزودن q.Enqueue(10); q.Enqueue(20) O(1)
Queue<T>.Dequeue() حذف اولین q.Dequeue(); int first = q.Dequeue(); خطا در صورت خالی بودن
Queue<T>.Peek() مشاهده اولین q.Peek(); int peek = q.Peek(); خطا در صورت خالی بودن
Stack<T> پشته LIFO Stack<int> s = new Stack<int>(); s.Push(10); Last-In-First-Out
Stack<T>.Push() افزودن عنصر s.Push(10); s.Push(20) O(1)
Stack<T>.Pop() حذف از بالا s.Pop(); int top = s.Pop(); O(1)، خطا در صورت خالی بودن
Stack<T>.Peek() مشاهده بالا s.Peek(); int top = s.Peek(); خطا در صورت خالی بودن
HashSet<T> عناصر یکتا HashSet<int> hs = new HashSet<int>(); hs.Add(10); جلوگیری از تکراری‌ها
Set<T>.Add() افزودن یکتا hs.Add(10); hs.Add(5); True اگر اضافه شد
HashSet<T>.Remove() حذف عنصر hs.Remove(10); hs.Remove(5); True اگر حذف شد
ObservableCollection<T> کالکشن قابل مشاهده ObservableCollection<string> oc = new ObservableCollection<string>(); oc.Add("Item"); اعلان تغییرات به UI
ConcurrentDictionary\<TKey,TValue> همزمان ConcurrentDictionary\<int,string> cd = new ConcurrentDictionary\<int,string>(); cd.TryAdd(1,"علی"); چند نخی
ConcurrentQueue<T> صف همزمان ConcurrentQueue<int> cq = new ConcurrentQueue<int>(); cq.TryDequeue(out int val); چند نخی
ConcurrentStack<T> پشته همزمان ConcurrentStack<int> cs = new ConcurrentStack<int>(); cs.TryPop(out int val); چند نخی

📊 Complete سی‌شارپ Properties Reference

Property Values Default Description سی‌شارپ Support
Count int 0 تعداد عناصر تمام کالکشن‌ها
Capacity int پویا ظرفیت قبل از افزایش List<T>, ArrayList
IsReadOnly bool false خواندنی فقط ICollection<T>, IList<T>
Keys TKey Collection N/A مجموعه کلیدها Dictionary\<TKey,TValue>
Values TValue Collection N/A مجموعه مقدارها Dictionary\<TKey,TValue>
Comparer IEqualityComparer Default مقایسه عناصر HashSet<T>, Dictionary\<TKey,TValue>
SyncRoot object null شیء همگام‌سازی ICollection
IsSynchronized bool false ایمنی نخ ICollection
CollectionChanged Event N/A رویداد تغییر کالکشن ObservableCollection<T>
CapacityChanged Event N/A رویداد تغییر ظرفیت List<T>
Comparer IComparer Default مقایسه در SortedList/SortedDictionary SortedList\<TKey,TValue>, SortedDictionary\<TKey,TValue>

مرجع کالکشن‌ها در سی‌شارپ ابزاری حیاتی برای توسعه‌دهندگان حرفه‌ای است. با تسلط بر کالکشن‌های جنریک، دیکشنری‌ها، صف‌ها، پشته‌ها و مجموعه‌های یکتا، می‌توان برنامه‌های مقیاس‌پذیر، بهینه و امن ایجاد کرد. رعایت بهترین شیوه‌ها شامل استفاده از جنریک‌ها، مدیریت استثنا، انتخاب مناسب ساختار داده و بهینه‌سازی با LINQ است. مراحل بعدی شامل یادگیری ObservableCollection، کالکشن‌های همزمان، LINQ پیشرفته و طراحی الگوریتم‌های بهینه است. منابع اضافی شامل مستندات رسمی مایکروسافت، پروژه‌های متن باز و دوره‌های آموزشی پیشرفته سی‌شارپ می‌باشد.

🧠 دانش خود را بیازمایید

آماده شروع

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
سوالات
🎯
70%
برای قبولی
♾️
زمان
🔄
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود