۱۴۰۴/۰۷/۰۹ Nebular

۱. LINQ و Deferred Execution

۱.۱ LINQ چیست؟

  • LINQ (Language Integrated Query) امکان نوشتن query روی مجموعه‌ها را به صورت نوع امن (type-safe) و خوانا فراهم می‌کند.
  • مثال: query روی List<T>، Array یا IQueryable<T>.
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

۱.۲ Deferred Execution

  • Deferred Execution یعنی query تا زمانی که واقعاً نتایج مصرف نشوند (enumerate) اجرا نمی‌شود.
  • این باعث می‌شود query تنظیم و بهینه‌تر باشد و فقط وقتی داده نیاز شود، اجرا شود.

مثال:

int[] numbers = { 1, 2, 3, 4, 5 };
var query = numbers.Where(n => n > 2); // هنوز اجرا نشده
numbers[4] = 100; // تغییر روی مجموعه اصلی
foreach (var n in query)
{
    Console.WriteLine(n); // اجرا اینجا اتفاق می‌افتد → خروجی: 3,4,100
}

نکته: اگر بخواهیم query بلافاصله اجرا شود و نتایج ذخیره شود، از ToList() یا ToArray() استفاده می‌کنیم:

var list = numbers.Where(n => n > 2).ToList(); // فورس اجرا

۲. Collections و Thread-Safety

۲.۱ Collections معمولی

  • List<T> و Dictionary<K,V>:
    • Thread-safe نیستند → اگر چند thread همزمان تغییر دهند ممکن است خطا رخ دهد یا داده خراب شود.
    • مناسب برنامه‌های تک‌نخی (single-thread) یا اگر خودت lock بگذاری.

مثال:

List<int> list = new List<int>();
Parallel.For(0, 10, i => list.Add(i)); // ممکن است crash یا نتیجه نادرست

۲.۲ Collections Thread-safe

  • C# مجموعه‌های ویژه‌ای برای محیط‌های چند نخ دارد:
    • ConcurrentDictionary<K,V> → dictionary امن برای چند thread
    • ConcurrentBag<T> → مجموعه بدون ترتیب، امن برای چند thread
    • ConcurrentQueue/Stack → صف و پشته thread-safe

مثال ConcurrentDictionary:

using System.Collections.Concurrent;

ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>();
Parallel.For(0, 10, i => dict.TryAdd(i, $"Value {i}"));
Console.WriteLine(dict.Count); // همیشه درست است، thread-safe

۳. جمع‌بندی نکات مهم آزمونی

نکتهتوضیح
LINQنوشتن query روی مجموعه‌ها، نوع امن و خوانا
Deferred Executionquery تا زمان enumerate اجرا نمی‌شود، برای فورس اجرا از ToList()/ToArray() استفاده می‌کنیم
List<T> / Dictionary<K,V>Thread-safe نیستند → نیاز به lock در چند thread
ConcurrentDictionary / ConcurrentBagthread-safe هستند، مناسب برنامه چند نخ

نکات تستی معمول:

  1. سوال درباره Deferred Execution و اینکه query کی اجرا می‌شود.
  2. سوال درباره کدام collection thread-safe است.
  3. سوال درباره ToList() برای فورس اجرا.
Accept Cookies
Accept Cookies
[your-shortcode]