چند قابلیت بهینه شده برای LINQ در Net 6.

معمولا در هر نسخه از DotNet علاوه بر ارائه قابلیت‌های جدید شاهد بهینه شدن ساختارهای قبلی نیز هستیم. در DotNet نسخه 6 نیز دستورات جالب و کاربردی مختلفی برای LINQ ارائه شده است که در این مقاله به توضیح آن‌ها می‌پردازیم.

Chunk

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

اگر فرض کنیم که می‌خواهیم محتویات درون لیست languages را به چند لیست دیگر بر مبنای تعداد اعضا تقسیم کنیم شاید به ذهن شما ایجاد یک متد برای گرفتن لیست و سپس تعداد اعضای درخواستی برای هر لیست خطور کند. شاید متدی شبیه متد زیر که بعنوان ورودی نام لیست و تعداد اعضای درخواستی را می‌گیرد و سپس تا آن‌جا که امکان دارد لیست‌هایی با تعداد اعضای درخواستی ایجاد و همه‌ی آن‌ها را در قالب یک لیست دیگر برگشت می‌دهد:

خوب خبر خوب این است که قابلیت بالا بدون نوشتن کد اضافی و بصورت پیش‌فرض در .Net 6 اضافه شده است و شما فقط نیاز دارید که آن را فراخوانی کنید!

در کد بالا با نوشتن نام لیست و فراخوانی متد Chunk می‌توانید معین کنید که لیست داده شده به چند لیست و با چه تعداد عضو تبدیل شود این کار برای تعداد داده‌های زیاد کار بسیار منطقی به نظر می‌رسد. خروجی دستور بالا <[]IEnumerable<string مي‌باشد:

همان‌طور كه ملاحظه مي‌كنيد دو آرايه از نوع string كه هر كدام داراي 3 عضو هستند برگشت داده شده است. (اگر تعداد عناصر يك ليست به تعداد اعضاي درخواستي شما بخش‌پذير نباشد مشكلي ايجاد نمي‌شود فقط ليست آخر اعضاي كمتري خواهد داشت).

مقاله‌ی مرتبط:

Zip قسمت اول

قابليت بعدي متدZip  است. اين متد خيلي جالب است بدين صورت كه اگر فرض كنيم يك ليست داشته باشيم و بخواهيم به آن ليست‌ها يك عضو ديگر اضافه كنيم (به ازاي هر عنصر) براحتي مي‌توانيم اين كار را انجام دهيم به برنامه زير دقت كنيد:

حال فرض كنيد كه يك ليست ديگر شامل داده‌هايي مرتبط با عناصر موجود در ليست اول باشد مثلا:

ميخواهيم‌ اطلاعات ليست دوم در كنار اطلاعات ليست اول قرار گيرند. اين كار براحتي با استفاد از متد Zip امكان پذير است:

خروجي دستور بالا همانند زير است:

(C#, 2000)

(Python, 1991)

(Java, 1995)

(JavaScript, 1995)

(Ruby, 1995)

(Html, 1993)

 

Zip قسمت دوم

متد Zip يك قابليت ديگر نيز دارد و آن هم امكان اضافه كردن دو ليست به ليست اصلي است:

خروجي دستور بالا همانند زير است:

(C#, 2000, Item)

(Python, 1991, Item)

(Java, 1995, Item)

(JavaScript, 1995, Item)

(Ruby, 1995, Item)

(Html, 1993, Item)

 

متدهاي MinBy و MaxBy

فرض كنيد ليستي از اعضاي يك خانواده در برنامه است كه مي‌خواهيم بزرگترين و كوچكترين عضو آن خانواده بر اساس سن را بدست آوريم. خوب شايد يك راه حل ساده استفاده از متد OrderBy و OrderByDescending باشد:

اما يك راه حل ساده‌تر استفاده از متدهاي MinBy و MaxBy است:

متد ElementAt

اين متد نيز در نسخه جديد دات نت بهينه تر شده است. شما براحتي مي‌‎توانيد يك عنصر را صرفا با وارد كردن انديس آن واكشي كنيد (خروجي دستور در مقابل آن كامنت شده است سومين عنصر از ابتدا):

و اگر اين كار را خواستيد از انتها انجام بدهيد كافي است تا ابتداي آن كاراكتر ^ را قرار دهيد ! (خروجي دستور در مقابل آن كامنت شده است دومين عنصر از انتها):

بهينه شدن متد Take

تصور كنيد كه مي‌خواهيم از يك انديس تا تعداد مشخصي عنصر را واكشي كنيم. شايد راه حل زير به ذهنتان برسد:

اما يك راه ساده‌تر راه حل زير است (خروجي دستور در مقابل آن كامنت شده است از دومين عنصر تا عنصر چهارم):

حال تصور كنيد كه بخواهيم اين كار از انتها صورت بگيرد. مثلا سه عنصر آخر را بخواهيم. در اين صورت بايد باز هم از كاراكتر ^ به همراه دو نقطه ممتد استفاده كنيم:

متد TryGetNonEnumeratedCount

تصور كنيد كه در جايي از برنامه نياز داريد تا تعداد عناصر يك ليست را داشته باشيد. احتمالا از متد Count استفاده خواهيد كرد:

شايد ما يك نكته مهم را در نظر نگيريم و آن‌ هم اين است كه با فراخواني متد Count اعضاي ليست دوباره شمارش مي‌شوند در صورتي كه اين كار شايد نياز نباشد. براي جلوگيري از اين كار مي‌توانيم از متد TryGetNonEnumeratedCount استفاده كنيم. اين متد سعي مي‌كند بدون شمارش مجدد اعضاي يك ليست تعداد آن‌ها را برگشت دهد. اگر توانست اين كار را انجام دهد نتيجه true و در غير اين‌صورت نتيجه false خواهد بود. در صورت صحيح بودن نتيجه ميتوان از متغير count براي نمايش تعداد عناصر استفاده كرد.

خروجي دستور بالا برابر زير است:

Total Elements: 6

خروج از نسخه موبایل