تصادفی کردن آیتمهای لیست با استفاده از Extension Method
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

شاید برای شما هم پیش آمده باشد که بخواهید در هر بار واکشی لیستی از اطلاعات، مثلا از دیتابیس، آیتمهای آن را بصورت تصادفی مرتب کنید.
 من در پروژه اخیرم برای نمایش یک سری سوال مجبور بودم که در هر بار نمایش سوالات، لیست را به صورت رندوم مرتب کنم و به کاربر نمایش بدم. برای حصول این مهم، یک extension method به شکل زیر نوشتم:
    public static class RandomExtentions
    {
        public static void Shuffle<T>(this IList<T> list)
        {
            Random rng = new Random();
            Thread.Sleep(100);
            int n = list.Count;
            while (n > 1)
            {
                n--;
                int k = rng.Next(n + 1);
                T value = list[k];
                list[k] = list[n];
                list[n] = value;
            }
        }
    }
در این تابع که اسمش را Shuffle گذاشتم، با دریافت یک لیست از نوع T، آیتم‌های درون لیست را به صورت تصادفی مرتب می‌کند.

مثال :
var x =new  List<int>();
x.Add(1);
x.Add(2);
x.Add(3);
x.Add(4);
x.Add(5);
x.Shuffle();
در این مثال لیست x که از نوع int میباشد پس از فراخوانی Shuffle به یک لیست نامرتب تبدیل میشود که نحوه چیدمان در هر بار فراخوانی، تصادفی خواهد بود.
  • #
    ‫۱۰ سال و ۵ ماه قبل، یکشنبه ۷ اردیبهشت ۱۳۹۳، ساعت ۱۸:۴۶
    اگر از EF استفاده می‌کنید، برای اینکار یک ستون Guid پویا را اضافه می‌کند. سپس بر اساس این ستون، مرتب سازی را انجام می‌دهد. اطلاعات بیشتر
    • #
      ‫۱۰ سال و ۵ ماه قبل، یکشنبه ۷ اردیبهشت ۱۳۹۳، ساعت ۱۹:۰۰
      با سپاس از شما. در صورت استفاده ار EF روشی که شما فرمودین بهتر و کارامدتر هستش.
  • #
    ‫۱ سال قبل، دوشنبه ۲۰ شهریور ۱۴۰۲، ساعت ۱۳:۵۹
    یک نکته‌ی تکمیلی

    تا دات نت 7 می‌توان از روش زیر برای انتخاب تصادفی اعضای یک مجموعه استفاده کرد:
    ‍MyCollection.OrderBy(x => Random.Shared.Next()).Take(10)
    Random.Shared، به دات نت 6 برای تولید اعداد تصادفی thread-safe اضافه شد. اهمیت thread-safe بودن آن‌را در مطلب «اثبات قانون مشاهده‌گر در برنامه نویسی» می‌توانید مطالعه کنید.