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
Lepaskan: 2025-02-03 07:58:13
asal
1041 orang telah melayarinya

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:

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;  
    }  
}
Salin selepas log masuk

<方法> cara menggunakan:

List<Product> products = GetProducts();
products.Shuffle();
Salin selepas log masuk
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

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--;
        }
    }
}
Salin selepas log masuk
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

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))); }
    }
}
Salin selepas log masuk
Mengintegrasikan kaedah keselamatan thread ke kaedah lanjutan shuffle:

<<>
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;
    }
}
Salin selepas log masuk
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 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