loading...
طراحی وب- برنامه نویسی
برنامه نویس بازدید : 31 شنبه 29 تیر 1398 نظرات (0)

 

با سلام به کاربران عزیز با یکی دیگر از سری آموزش های LINQ در C# در خدمت شما هستیم. در این جلسه قصد داریم با اپراتورهای Partition آشنا شویم.

Partition Operators چیست؟

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

اپراتورهای Partition در LINQ به چهار بخش:

  • Take
  • TakeWhile
  • Skip
  • SkipWhile

تقسیم بندی می شوند که در جدول زیر کاربرد هر یک بررسی شده است:

کاربرد نام اپراتور
برای بازگرداندن تعدادی مشخص از عناصر یک مجموعه یا لیست استفاده می شود Take
کاملا شبیه به Take است فقط عناصری که در شرطی مشخص صدق کنند را برمی گرداند TakeWhile
برای نادیده گرفتن تعدادی مشخص از عناصر یک مجموعه یا لیست استفاده می شود Skip
کاملا شبیه به Skip است، فقط عناصری که در شرطی مشخص صدق کنند را نادیده می گیرد SkipWhile

متد Take

فرض کنید مجموعه ای متشکل از تعدادی عضو وجود دارد و قصد شما این است که n عضو اول این مجموعه را در اختیار بگیرید، برای این کار از متد Take استفاده می شود. کاربرد آن بسیار ساده بوده و الگوی آن به صورت زیر است:

توجه کنید در اینجا نوع داده ی result از نوع <IEnumerable<string است. در این الگو فرض شده داده های list از نوع string  هستند، به همین خاطر در <> نوع string نوشته شده است. همان طور که قبلا بیان شد برای راحتی کار می توانید از نوع داده ی var به جای <>IEnumerable استفاده کنید.

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

در این مثال ساده یک آرایه از جنس string با اعضایی مشخص وجود دارد و می خواهیم سه عضو اول این آرایه را در خروجی چاپ کنیم. این کار توسط فراخوانی متد Take بر روی مجموعه ی مورد نظر قابل انجام است.

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

یا

 

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

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

مشاهده می کنید که در این مثال یک List با جنس داده ی Student با اعضایی مشخص در اختیار داریم که با استفاده از متد Take به دو عضو اول آن دسترسی پیدا کرده ایم.

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

 

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

متد TakeWhile

این متد تا حدودی مانند متد Take عمل می کند فقط قابلیت پیاده سازی شرط را به همراه دارد. در واقع Take نوع داده ی int را به عنوان پارامتر ورودی می پذیرد اما TakeWhile شرط را به عنوان پارامتر ورودی می گیرد.

به الگوی استفاده از آن توجه کنید:

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

در این مثال قصد داریم عناصری که با I (بزرگ) شروع می شوند را در خروجی نشان دهیم. احتمالا انتظار دارید که خروجی دو کلمه ی Iran و India باشد اما این چنین نخواهد بود. به یاد داشته باشید شرط متد تا زمانی معتبر است که نقض نشود.پس به محض نقض شدن شرط اجرای متد TakeWhile متوقف خواهد شد.

همین مثال را در نظر بگیرید. عضو اول با حرف I شروع می شود پس شرط را ارضا می کند اما عضو دوم با R شروع می شود بنابراین شرط متد نقض شده و فورا اجرای متد متوقف می شود و اهمیت ندارد که عناصر بعدی در شرط صدق می کنند یا نه.

روش Query:

مثال دوم این متد را در نظر بگیرید:

یک آرایه از نوع int در اختیار داریم که همه ی اعضای آن به جز یکی زوج هستند. شرط قرار داده شده در متد TakeWhileبرای گرفتن اعداد زوج موجود در آرایه است.

همان طور که در خروجی مشاهده می کنید فقط سه عضو اول که در شرط صدق می کنند به عنوان خروجی در نظر گرفته شده اند و وجود عنصر چهارم (7) باعث می شود شرط نقض شده و اجرای متد متوقف شود پس عناصر زوجی که بعد از آن قرار دارند در خروجی نشان داده نمی شوند.

روش Query:

 

خروجی متد TakeWhile خروجی متد TakeWhile

متد Skip

این متد کاملا برعکس متد Take عمل می کند و تعداد n عنصر اول یک مجموعه را نادیده گرفته و بقیه را به عنوان خروجی در نظر می گیرد.

به الگوی استفاده از آن توجه کنید:

مثال اول متد Take را برای این متد بازنویسی می کنیم:

متد Skip فقط یک int  به عنوان پارامتر ورودی می گیرد که تعیین می کند که چند عضو از مجموعه نادیده گرفته شوند. در این مثال قصد داریم 3 عنصر اول یک آرایه را نادیده بگیریم و بقیه را در خروجی چاپ کنیم برای این منظور عدد 3 را در متدSkip قرار داده ایم.

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

همان طور که مشاهده می کنید از عنصر سوم به بعد در خروجی چاپ شده اند.

روش Query:

 

متد SkipWhile

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

به الگوی استفاده از آن توجه کنید:

برای این که تفاوت دو متد را بهتر درک کنید مثال دوم مربوط به متد TakeWhile را برای این متد بازنویسی می کنیم:

در این مثال فقط جای TakeWhile را با SkipWhile عوض کرده ایم. کد را اجرا و خروجی را مشاهده کنید. شرط نوشته شده در متد باعث می شود عناصری که در شرط صدق می کنند نادیده گرفته شوند. وجود عضو فرد باعث نقض شدن شرط شده و اجرای متد را متوقف می کند.

بنابراین خروجی به شکل زیر خواهد بود:

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

حالا ممکن است این سوال پیش بیاید که اصلا این متدها کجا کاربرد دارند و فایده آنها چیست؟

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

در این مثال با استفاده از دو متد Take و Skip عمل صفحه بندی اطلاعات را پیاده سازی کرده ایم. به منظور تکرار کلیه ی عملیات، تمامی کد ها در داخل while با شرطی همواره صحیح قرار گرفته اند.

ابتدا اطلاعات را توسط متد GetList که در کلاس Student تعریف کرده ایم در داخل متغیر StuList قرار داده ایم. در مرحله ی بعد در if اول، عدد بودن کاراکتر وارد شده توسط کاربر را کنترل شده  و در if دوم، شرط وارد شدن اعداد 1 تا 5 را اعمال کرده ایم. اگر عدد وارد شده توسط کاربر بین 1 تا 5 باشد مقدار آن در PageNum ذخیره می شود.

در این مثال می خواهیم در هر صفحه 3 رکورد نمایش داده شود برای این منظور PageSize=3 قرار داده ایم.

اجازه دهید خط کد (StuList.Skip((PageNum - 1) * PageSize).Take(PageSize را با استفاده از عدد گذاری در آن توضیح دهیم. فرض کنید کاربر، شماره ی صفحه را 2 وارد کرده بنابراین PageNum - 1=1 ضرب در PageSize=3 می شود که حاصل آن عدد 3 خواهد شد.

پس 3 عضو اول مجموعه ی StuList  توسط متد Skip نادیده گرفته می شوند و باقی در خروجی نمایش داده خواهند شد اما هدف ما نمایش سه رکورد در هر صفحه است، پس باید از عناصر باقی مانده سه عضو اول آن را در اختیار بگیریم که این کار توسط متد Take انجام خواهد شد و پارامتر ورودی آن نیز PageSize=3 می باشد.

در ادامه هم مانند قبل توسط یک حلقه اطلاعات را در خروجی چاپ می کنیم:

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

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

موفق باشید.

منبع: روکسو

 

 
ارسال نظر برای این مطلب

کد امنیتی رفرش
اطلاعات کاربری
  • فراموشی رمز عبور؟
  • آرشیو
    آمار سایت
  • کل مطالب : 346
  • کل نظرات : 0
  • افراد آنلاین : 4
  • تعداد اعضا : 0
  • آی پی امروز : 22
  • آی پی دیروز : 17
  • بازدید امروز : 145
  • باردید دیروز : 21
  • گوگل امروز : 2
  • گوگل دیروز : 5
  • بازدید هفته : 219
  • بازدید ماه : 584
  • بازدید سال : 7,093
  • بازدید کلی : 35,328