LINQ
LINQ
بخشی از آموزش جامع C# و .NET 10
محتوای درس LINQ
LINQ یک مدل یکپارچه برای Query روی Collectionها و منابع داده ارائه میکند. خوانایی Query، Deferred Execution و انتخاب Operator مناسب از نکات کلیدی استفاده حرفهای از LINQ هستند.
۱. Where و Select
Where فیلتر و Select Projection انجام میدهد. بهتر است هر مرحله هدف روشن و قابل خواندن داشته باشد.
مثال
var r=new[]{1,2,3,4}.Where(x=>x%2==0).Select(x=>x*10);
Console.WriteLine(string.Join(",",r));در این مثال، مفهوم «Where و Select» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۲. Ordering
OrderBy و ThenBy ترتیب چندسطحی ایجاد میکنند و نسخه Descending برای جهت نزولی است.
مثال
var r=new[]{3,1,2}.OrderBy(x=>x);
Console.WriteLine(string.Join(",",r));در این مثال، مفهوم «Ordering» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۳. Element Operators
First، FirstOrDefault، Single و SingleOrDefault semantics متفاوتی دارند و باید متناسب با انتظار تعداد نتایج انتخاب شوند.
مثال
int first=new[]{10,20}.First();
bool any=new[]{1,2}.Any(x=>x>1);در این مثال، مفهوم «Element Operators» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۴. Aggregation
Count، Sum، Average، Min و Max عملیات تجمیعی رایج هستند.
مثال
int sum=new[]{1,2,3}.Sum();
double avg=new[]{1,2,3}.Average();در این مثال، مفهوم «Aggregation» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۵. GroupBy و Join
GroupBy داده را بر اساس Key گروهبندی و Join رابطه میان دو Sequence را بر اساس Key ایجاد میکند.
مثال
var g=new[]{"ali","amir","sara"}.GroupBy(x=>x[0]);
foreach(var x in g) Console.WriteLine(x.Key);در این مثال، مفهوم «GroupBy و Join» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۶. Deferred Execution
بسیاری از Queryهای LINQ تا زمان Enumeration اجرا نمیشوند. ToList و ToArray نتیجه را Materialize میکنند.
مثال
var list=new List<int>{1,2}; var q=list.Where(x=>x>1); list.Add(3); Console.WriteLine(string.Join(",",q));در این مثال، مفهوم «Deferred Execution» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۷. مثالهای عملی
var expensiveProducts = products
.Where(p => p.Price > 1_000_000m)
.OrderByDescending(p => p.Price)
.Select(p => new { p.Name, p.Price })
.ToList();این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
var groups = products
.GroupBy(p => p.Category)
.Select(g => new { Category = g.Key, Count = g.Count() });این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
۸. خطاهای رایج
• استفاده از Single وقتی چند نتیجه مجاز است
• اجرای ToList زودهنگام در چند مرحله
• Queryهای بسیار طولانی و چندمنظوره
۹. نکات اجرایی
• نامها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.
• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.
• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.
۱۰. تمرین عملی
لیستی از محصولات را بر اساس دسته گروهبندی کنید و برای هر دسته تعداد، میانگین قیمت و گرانترین محصول را به دست آورید.
۱۱. جمعبندی
در این فصل، مبانی «LINQ» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.