اپراتورهای Element در LINQ

0
81
اپراتورهای Element در LINQ

سلام با یکی دیگر از آموزش های LINQ در خدمت شما عزیزان هستیم در این جلسه& آموزش اپراتورهای Element را بررسی خواهیم کرد.

Element Operators چیست؟

یکی از ساده ترین مبحث های LINQ، اپراتورهای Element هستند که کاربرد کلی آن ها برای بازگرداندن اولین یا آخرین عنصر یک مجموعه با روش های مختلف است

در ادامه با آن ها آشنا خواهیم شد.

اپراتورهای Element به شرح زیر هستند:

  1. First
  2. FirstOrDefault
  3. Last
  4. LastOrDefault
  5. ElementAt
  6. ElementAtOrDefault
  7. Single
  8. SingleOrDefault
  9. DefaultIfEmpty

که خلاصه ی کاربرد آن ها مطابق جدول زیر است:

کاربرد نام اپراتور
عنصر اول یک مجموعه را باز می گرداند First
کاملا مانند First است اما در صورت خالی بودن مجموعه مقدار 0 را باز می گرداند FirstOrDefault
عنصر آخر یک مجموعه را باز می گرداند Last
کاملا مانند Last است اما در صورت خالی بودن مجموعه مقدار 0 را باز می گرداند LastOrDefault
عنصر nام یک مجموعه را باز می گرداند ElementAt
کاملا مانند ElementAt است اما در صورت خالی بودن مجموعه مقدار 0 را باز می گرداند ElementAtOrDefault
عنصر خاصی را از مجموعه باز می گرداند Single
مانند Single اما در صورت خالی بودن مجموعه مقدار 0 را باز می گرداند SingleOrDefault
اگر مقادیر خالی یا صفر شامل لیست یا مجموعه باشد، مقادیر پیش فرض را برمی گرداند DefaultIfEmpty

متد First

این متد عنصر اول یک مجموعه را باز می گرداند اما اگر شرطی در آن قرار داده شود اولین عنصری که در شرط صدق می کند را باز می گرداند.

الگوی استفاده از آن به صورت زیر است:

توجه کنید نوع داده ی result از نوع داده ی objList خواهد بود.

به مثال زیر توجه کنید:

در این مثال نوع داده ی آرایه از نوع int است پس وقتی شی objList متد First را فراخوانی می کند، جنس خروجی آن (result) از نوع int خواهد بود.

در این مورد متد First بدون پارامتر به کار برده شده در نتیجه عنصر اول آرایه را باز می گرداند. حالا فرض کنید در متد First شرطی را به صورت زیر وارد کنیم:

در این حالت اولین عنصری که زوج است به عنوان خروجی در نظر گرفته می شود که در این مورد عدد 2 خواهد بود.

به مثال دوم از کاربرد First توجه کنید:

در این مثال عناصر موجود در List از جنس کلاس Student هستند که ما قصد داریم اولین شخصی که ID آن زوج است را در خروجی نشان دهیم. با دقت بسیار به نوع داده ی result توجه کنید.

خروجی:

بازنویسی کد به روش Query به صورت زیر است:

متد FirstOrDefault

قبل از توضیح این متد، در IDE خود یکی از مثال های متد First را به گونه ای تغییر دهید که First بر روی یک List یا آرایه ی خالی از عنصر اعمال شود. خواهید دید که با Run کردن، برنامه با exception مواجه می شوبد. راه حل این مشکل استفاده از متد FirstOrDefault است. در واقع کاربرد آن کاملا مشابه با First است حتی می توانید در دو مثال مربوط به First به جای آن از FirstOrDefault استفاده کنید. اما استفاده از این متد یک مزیت به همراه دارد که در صورت خالی بودن مجموعه، برنامه با exception مواجه نمی شود و مقدار پیش فرض صفر را باز می گرداند.

به مثال زیر توجه کنید:

کد بالا را اجرا کنید، خواهید دید که با این که objVals خالی از عنصر است اما برنامه بدون exception اجرا شده و مقدار پیش فرض صفر برای آرایه ی خالی در نظر گرفته می شود.

متد Last

از نظر کارکرد کاملا شبیه به متد First است با این تفاوت که متد First از اول یک مجموعه (سمت چپ) کار خود را شروع می کند اما متد Last از آخر یک مجموعه (سمت راست) آغاز به کار می کند.

الگوی استفاده از آن به صورت زیر است:

توجه داشته باشید که نوع داده ی var به نوع داده ی objList بستگی دارد.

به مثال زیر توجه کنید:

خروجی آن عدد 8 خواهد بود زیرا متد Last از آخر آرایه شروع به پیمایش می کند و اولین عنصری که زوج است را باز می گرداند.

بازنویسی کد به روش Query به صورت زیر است:

متد LastOrDefault

این متد نیز مانند FirstOrDefault عمل می کند اما جهت پیمایش مجموعه را از سمت راست شروع می کند و در صورت خالی بودن مجموعه عدد صفر را باز می گرداند.

کد زیر را در IDE خود بنویسید:

حال آن را اجرا کنید، خواهید دید که با exception مواجه می شوید اما دلیل آن چیست؟

در این مورد شرط ما بازگرداندن آخرین عنصر زوج یک مجموعه است. همان طور که مشاهده می کنید تمامی عناصر موجود در آرایه فرد هستند پس با وجود شرط، آرایه ی موجود، یک آرایه ی خالی به حساب می آید. برای این که در اجرای کد بالا به exception برخورد نکنیم لازم است با استفاده از متد FirstOrDefault کد را باز نویسی کنیم تنها کافی است Last را به FirstOrDefault تغییر دهید.

روش Extension:

روش Query:

با اعمال تغییر، دوباره کد را اجرا کنید. خواهید دید که این بار خروجی مقدار صفر خواهد یود.

متد ElementAt

کاربرد این متد بسیار ساده بوده و تنها ورودی آن پارامتری از جنس int است و با توجه به عدد وارد شده در آن، عنصری را به عنوان خروجی در نظر می گیرد.

الگوی استفاده از آن به صورت زیر است:

توجه کنید که نوع داده ی var به نوع داده ی objList بستگی دارد.

مثال:

در این مثال با استفاده ار متد ElementAt قصد داریم عنصر سوم از List را در خروجی چاپ کنیم. دقت به این نکته ضروری است که شمارنده ی متد ElementAt از  0 شروع می شود بنابراین در این مثال برای دستیابی به عنصر شماره سوم باید عدد 2 را در ElementAt وارد کنیم که در نتیجه ی آن خروجی به صورت

Element from the List: Jacob ID=3 خواهد شد.

برای پیاده سازی کد به روش Query به صورت عمل می کنیم:

به مثالی دیگر از کاربرد متد ElementAt توجه کنید:

روش Query:

خروجی مثال دوم ElementAt
خروجی مثال دوم ElementAt

متد ElementAtOrDefault

این متد شباهت بسیار زیادی به متد ElementAt دارد با این تفاوت که اگر توسط یک مجموعه خالی از عضو فراخوانی شود، برنامه با exception مواجه نمی شود و مقدار پیش فرض را صفر در نظر می گیرد.

الگوی استفاده از آن به صورت زیر است:

توجه کنید که نوع داده ی var به نوع داده ی objList بستگی دارد.

مثال:

برنامه را اجرا و خروجی را مشاهده کنید. در مورد result و val، اعداد وارد شده در متد ElementAtOrDefault جز ایندکس آرایه objList هستند. پس عضو متناظر با آن در خروجی چاپ شده است. در مورد val1 که عضو یازدهم در خواست شده اما در آرایه، پنج عضو وجود دارد. چون از متد ElementAtOrDefault استفاده شده، روند اجرای برنامه با مشکل روبرو نخواهد شد و مقدار صفر را در خروجی چاپ می کند.

روش Query:

خروجی مثال ElementAtOrDefault
خروجی مثال ElementAtOrDefault

متد Single

از این اپراتور برای بازگرداندن یک عنصر از مجموعه یا یک عنصر که در شرط صدق کند، استفاده می شود. در صورتی که بیش از یک عضو در مجموعه موجود باشد یا اصلا عضوی در مجموعه موجود نباشد خطای InvalidOperationException پرتاب می کند.

الگوی استفاده از آن به صورت زیر است:

توجه کنید که نوع داده ی var به نوع داده ی objList بستگی دارد.

برای درک بهتر این متد به مثال زیر توجه کنید:

در این مثال، ابتدا شی از لیستی که اعضای آن از جنس کلاس Student هستند، تعریف شده است. با استفاده از متد Single شرط یکتا بودن نام Suresh Dasari را در لیست چک کرده ایم که در صورت درست بودن شرط همان مقدار در خروجی چاپ می شود، در غیر این صورت خطای InvalidOperationException پرتاب می شود.

حالا به objList دقت کنید که یک آرایه از نوع int با یک عضو تعریف شده و در ادامه با استفاده از متد Single شرط تک عضوی بودن آرایه چک شده است. بنابراین مقدار عنصر موجود در آرایه به عنوان خروجی چاپ می شود. توجه داشته باشید خروجی برنامه خطای InvalidOperationException خواهد بود اگر یکی از حالت های زیر پیش آید:

حالت اول:

یا

یا

حالت دوم:

یا

برای بازنویسی کد به روش Query به این صورت عمل می کنیم:

متد SingleOrDefault

در مورد متد Single به یاد دارید که در دو حالت خالی بودن مجموعه و وجود بیش از یک عضو خطای InvalidOperationException  توسط این متد پرتاب می شود. در مورد متد SingleOrDefault کاملا به همین صورت است، فقط خالی بودن مجموعه از عضو، باعث بروز خطای InvalidOperationException نمی شود.

الگوی استفاده از متد SingleOrDefault به صورت زیر است:

توجه کنید که نوع داده ی var به نوع داده ی objList بستگی دارد.

مثال:

مشاهده می کنید که در آرایه ی objList عضوی بزرگ تر از 5 وجود ندارد در حالی که شرط قرار داده شده بر روی آن به صورت (SingleOrDefault(j => j > 5 است. در صورتی که از متد Single استفاده کنیم با خطا روبرو می شویم اما SingleOrDefault در صورت موجود نبودن عضو مورد نظر، خروجی صفر نمایش داده می شود.

در مورد آرایه ی objList2 هم به همین صورت است، متد SingleOrDefault بر روی یک آرایه ی خالی از عضو فراخوانی شده، پس خروجی آن صفر است.

روش Query:

خروجی مثال SingleOrDefault
خروجی مثال SingleOrDefault

متد DefaultIfEmpty

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

الگوی استفاده از آن به صورت زیر است:

به مثال زیر توجه کنید:

همان طور که در بالا ذکر شد اگر متد DefaultIfEmpty بر روی یک مجموعه ی دارای عضو فراخوانی شود کار Select را انجام می دهد، که صحت این موضوع را می توان با دقت به آرایه ی List1 و خروجی تایید کرد. اما به آرایه ی List2 دقت کنید که خالی از عضو است. در حالت اول متد DefaultIfEmpty بدون پارامتر ورودی فراخوانی شده، پس مقدار صفر در خروجی نمایان می شود. در حالت دوم دوباره متد DefaultIfEmpty توسط List2 فراخوانی شده اما این بار متد، یک پارامتر ورودی دلخواه دارد و کاربرد آن بدین صورت است که در صورت خالی بودن مجموعه، پارامتر وردی متد DefaultIfEmpty در خروجی چاپ می شود.

روش Query:

خروجی مثال DefaultIfEmpty
خروجی مثال DefaultIfEmpty

این بخش از آموزش به پایان رسید. سعی کنید با استفاده از متد های بررسی شده در این بخش مثال های متعددی حل کنید چون این متدها علی رغم سادگی فرار هستند و نیاز به تمرین و تکرار دارند.

موفق باشید.

ترتیبی که روکسو برای یادگیری مطالب سری آموزش LINQ به شما توصیه می‌کند:

ارسال دیدگاه

لطفا دیدگاه خود را وارد کنید!
نام خود را وارد کنید