Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya dapat mengosongkan senarai generik dengan cekap di C#?

Bagaimanakah saya dapat mengosongkan senarai generik dengan cekap di C#?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-02-03 07:58:131007semak imbas

kaedah shuffle yang cekap senarai generik generik

Dalam pelbagai senario pengaturcaraan, urutan elemen dalam senarai generik secara rawak adalah operasi biasa. Artikel ini akan memperkenalkan cara terbaik untuk mencapai matlamat ini dalam C#.

pelaksanaan algoritma shuffle fisher-yates

Kaedah yang paling disyorkan ialah menggunakan algoritma shuffle Fisher-Yates, yang merupakan algoritma rawak senarai yang terkenal. Untuk menggunakan kaedah ini, sila tentukan kaedah lanjutan, seperti yang ditunjukkan di bawah:

<code class="language-csharp">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>

cara menggunakan:

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

Walaupun kecekapan yang tinggi, ia mungkin tidak dapat menghasilkan urutan rawak sebenar. Untuk meningkatkan rawak, perpustakaan menyediakan pilihan yang lebih dipercayai:

System.Random System.Security.Cryptography Pertimbangan Keselamatan Thread

<code class="language-csharp">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)n / 256))); //确保生成的随机数在范围内
            int k = (int)(box[0] * (n / 256.0));
            T value = list[k];
            list[k] = list[n - 1];
            list[n - 1] = value;
            n--;
        }
    }
}</code>
Apabila menggunakan kaedah pengembangan shuffle dalam aplikasi multi -threaded, adalah perlu untuk memastikan keselamatan benang. Penyelesaian yang mudah adalah untuk mencipta contoh baru

:

ThreadSafeRandom kaedah pengembangan yang dikemas kini

<code class="language-csharp">public static class ThreadSafeRandom
{
    [ThreadStatic] private static Random Local;

    public static Random ThisThreadsRandom
    {
        get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); }
    }
}</code>
Mengintegrasikan kaedah keselamatan thread ke kaedah lanjutan shuffle:

<code class="language-csharp">public static void Shuffle<T>(this IList<T> list)
{
    int n = list.Count;
    while (n > 1)
    {
        n--;
        int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}</code>
Jawapan Revied ini menyediakan ClererererAnplanations, meningkatkan kebolehbacaan kod (terutamanya peperiksaan rngcryprovider), dan menangani masalah keselamatan yang lebih berkesan.

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

Kenyataan:
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