🔸رندم کردن آرایه با استفاده از Linq
ابزار جست و جوی LINQ یکی از قدرتمندترین امکاناتی است که در C# در اختیار ما قرار دارد. این ابزار روشهای مختلف کنترل دادهها را فراهم میکند.
معمولاً از LINQ برای پرس و جو یا فیلتر کردن مجموعه دادهها استفاده میکنیم، اما میتوانیم برای تصادفی سازی نیز از LINQ استفاده کنیم. در این شیوه از ()OrderBy برای مرتب سازی دادهها براساس یک کلید مشخص استفاده میشود. برای این کار میتوانیم از روش مرتب کردن به وسیله GUID و روش مرتب کردن به وسیله کلاس Random استفاده کنیم.
🔻رندم کردن به وسیله GUID
با ترتیب دادن براساس ()Guid.NewGuid، که برای هر عنصر در آرایه یک شناسه منحصر به فرد ایجاد میکند، عناصر آرایه به صورت تصادفی با هم چیده میشوند.
array.OrderBy(x => Guid.NewGuid()).ToArray();🔻رندم کردن آرایه با یک کلاس رندم
این بار دادهها را بر اساس اعداد تصادفی تولید شده با استفاده از متد Next از Random.Shared مرتب می کنیم.
array.OrderBy(x => Random.Shared.Next()).ToArray();🔸رندم کردن آرایه در #C با استفاده از الگوریتم Fisher-Yates
int count = array.Length;در هر تکرار حلقه while، یک عدد تصادفی تولید میشود و عنصر مربوط به ایندکس عدد تولید شده تصادفی در آرایه با عنصر اشاره شده توسط متغیر count با استفاده از Tuple جابجا میشود. این کار تا زمانی ادامه پیدا میکند که count برابر ۱ شود. در نهایت، آرایه تغییر یافته را برمیگردانیم.
while (count > 1)
{
int i = Random.Shared.Next(count--);
(array[i], array[count]) = (array[count], array[i]);
}
این روش به صورت مستقیم روی آرایه ورودی عمل میکند و آن را برمیگرداند، در حالی که روشهای OrderBy یک کپی از آرایه را برمیگردانند.
🔻نسخه دیگر این الگوریتم به صورت زیر پیاده سازی میشود.
int count = array.Length;این روش تقریباً شبیه به روش قبلی است با این استثنا که از روش Array.Copy() برای کپی آرایه ورودی استفاده میکنیم. در بخش دیگری از متد، با متغیر arrayCopy کار میکنیم و پس از پایان کار آن را برمیگردانیم.
var arrayCopy = new int[count];
Array.Copy(array, arrayCopy, count);
while (count > 1)
{
int i = Random.Shared.Next(count--);
(arrayCopy[i], arrayCopy[count]) = (arrayCopy[count], arrayCopy[i]);
}
return arrayCopy;
💠 ملاحظات پرفورمنسی هنگام تصادفی سازی یک آرایه در C#
🔻روش الگوریتم Fisher-Yates تا حد زیادی بهترین عملکرد را دارد و در رتبه اول قرار دارد و تقریباً هیچ تخصیص حافظهای ندارد.
🔻نسخه اصلاح شده الگوریتم در رتبه دوم قرار دارد و به دلیل کپی کردن آرایه ورودی، تخصیص حافظه بیشتری نسبت به نسخه اصلی دارد.
🔻سپس، روش استفاده از Linq و کلاس Random با زمان اجرای بالاتر و تخصیص حافظه قابل توجه بالاتر نسبت به دو روش قبل - در رتبه سوم قرار دارد.
🔻و در نهایت، روش استفاده از Linq و GUID در میان چهار روش، در رتبه آخر قرار دارد و همچنین بالاترین تخصیص حافظه را دارد.
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
🔗 لینک مقاله در ویرگول
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______