مرجع کالکشنها
در سیشارپ، مرجع کالکشنها مجموعهای از ساختارهای داده است که امکان ذخیرهسازی، مدیریت و دسترسی به دادهها بهصورت دینامیک و مؤثر را فراهم میکند. استفاده از کالکشنها در توسعه نرمافزار اهمیت زیادی دارد، زیرا به توسعهدهندگان اجازه میدهد تا دادهها را بهصورت منظم نگهداری کرده، الگوریتمهای پیچیده را پیادهسازی کنند و برنامههایی با معماری شیءگرا و مقیاسپذیر بسازند. این ساختارها در پروژههای بزرگ مانند سیستمهای بانکی، فروشگاههای آنلاین، مدیریت کاربران و برنامههای بلادرنگ بسیار کاربردی هستند.
مرجع کالکشنها در سیشارپ شامل انواع کلیدی مانند List
با مطالعه این مرجع، خواننده میآموزد چگونه کالکشن مناسب را برای هر وظیفه انتخاب کند، الگوریتمهای مؤثر پیادهسازی نماید، خطاها و استثناها را مدیریت کند، از نشت حافظه جلوگیری کرده و عملکرد برنامه را بهینه کند. همچنین بهترین شیوهها و تکنیکهای پیشرفتهی گردش در کالکشنها ارائه شده تا توسعهدهندگان بتوانند سیستمهای قوی، قابل نگهداری و با کارایی بالا بسازند.
مثال پایه
textusing 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
این الگو برای کاربردهای واقعی مانند مدیریت فهرست محصولات، کاربران یا دادههای موقتی حافظه قابل استفاده است. این مثال همچنین نشاندهنده اصول شیءگرایی مانند انکپسولاسیون و مدولار بودن است و با توجه به مدیریت حافظه خودکار CLR، نیازی به آزادسازی دستی منابع نیست. درک این عملیات پایه برای ساخت برنامههای مقیاسپذیر و بهینه ضروری است.
مثال کاربردی
textusing 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
textusing 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\
بهترین شیوهها در سیشارپ شامل استفاده از کالکشنهای جنریک، انتخاب ساختار داده مناسب، پیمایش امن با 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.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود