Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh mengosongkan senarai generik secara rawak di C# dengan cekap dan selamat?

Bagaimanakah saya boleh mengosongkan senarai generik secara rawak di C# dengan cekap dan selamat?

Mary-Kate Olsen
Lepaskan: 2025-02-03 07:50:11
asal
165 orang telah melayarinya

How Can I Randomly Shuffle a Generic List in C# Efficiently and Safely?

Penyortiran rawak senarai generik generik

Penyortiran rawak senarai generik (seperti senarai digital) adalah tugas yang sama dalam pengaturcaraan. Dalam C#, terdapat pelbagai kaedah yang boleh menggunakan kaedah terbina, kaedah lanjutan, dan juga perpustakaan pihak ketiga untuk mencapai tujuan ini. Memahami kaedah dan batasan terbaik adalah penting untuk mendapatkan prestasi terbaik dan ketepatan.

kaedah pengembangan shuffle fisher-yates

Salah satu kaedah yang paling biasa digunakan ialah menggunakan algoritma fisher-yates untuk shuffle. Kaedah ini secara rawak mengganggu elemen ilist

dengan mengulangi unsur -unsur dengan indeks rawak. Blok kod berikut menunjukkan kaedah lanjutan untuk melaksanakan algoritma Fisher-Yates:

<code class="language-csharp">private static Random rng = new Random();

public static void Shuffle<T>(this IList<T> list)
{
    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;
    }
}</code>
Salin selepas log masuk
Untuk menggunakan kaedah pengembangan ini, hubungi shuffle () untuk ilist

. Contohnya:

Gunakan System.Security.Cryptography untuk meningkatkan rawak
<code class="language-csharp">List<Product> products = GetProducts();
products.Shuffle();</code>
Salin selepas log masuk

Walaupun System.Random adalah mudah, ia tidak selalu memberikan rawak yang cukup. Sekiranya anda memerlukan rawak yang lebih tinggi, sistem.security.cryptography Perpustakaan menyediakan penjana nombor rawak yang lebih selamat:

kepentingan pertimbangan prestasi dan keselamatan benang
<code class="language-csharp">using System.Security.Cryptography;
...
public static void Shuffle<T>(this IList<T> list)
{
    using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider())
    {
        int n = list.Count;
        while (n > 1)
        {
            byte[] box = new byte[1];
            do provider.GetBytes(box);
            while (!(box[0] < (byte)((double)uint.MaxValue / uint.MaxValue * n)));
            int k = (int)(box[0] % n);
            T value = list[k];
            list[k] = list[n - 1];
            list[n - 1] = value;
        }
    }
}</code>
Salin selepas log masuk

Kelas System.Random yang digunakan dalam contoh pertama bukan thread -safe. Ini bermakna jika beberapa benang cuba mengakses sistem yang sama. Untuk menyelesaikan masalah ini, kelas ThreadSafrandom menyediakan penyelesaian keselamatan thread dengan menggunakan penjana nombor rawak tempatan. Kaedah pengembangan shuffle () yang diubahsuai dari threadsaferantom untuk memastikan ketepatan dalam persekitaran multi -threaded.

Kesimpulan

Dalam senarai generik secara rawak, pemaju boleh memilih antara menggunakan System.Random (untuk kemudahan) atau System.Security.Cryptography (untuk rawak yang lebih baik) kaedah shuffling fisher-yates. Di samping itu, kelas Threadsaferandom membantu memastikan keselamatan benang dalam aplikasi multi -threaded. Kaedah khusus bergantung kepada pertimbangan rawak dan prestasi yang diperlukan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengosongkan senarai generik secara rawak di C# dengan cekap dan selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan