Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya dapat mengikat senarai dengan cekap dalam C#?

Bagaimanakah saya dapat mengikat senarai dengan cekap dalam C#?

DDD
DDDasal
2025-02-03 08:28:09654semak imbas

How Can I Efficiently Shuffle a List in C#?

Senarai C#🎜 🎜>

Dalam C#, penyortiran rawak senarai generik adalah tugas yang sama dalam pembangunan perisian. Sebagai contoh, dalam aplikasi loteri, anda mungkin perlu disusun secara rawak pada set digital terhad.

Amalan terbaik:

Dalam C#, kaedah yang paling berkesan untuk senarai tetapan rawak adalah dengan menggunakan kaedah pengembangan berdasarkan algoritma shuffling Fisher-Yates. Kaedah yang disediakan di bawah ini memastikan elemen senarai perombakan yang cekap dan benar -benar rawak:

cara menggunakan:

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

Kaedah lanjutan ini mudah. Pertimbangkan contoh berikut: Pilihan penjana nombor rawak:

Walaupun kod di atas menggunakan kaedah
<code class="language-csharp">List<Product> products = GetProducts();
products.Shuffle();</code>
, ia mesti mengakui batasan potensinya secara rawak. Jika aplikasi anda memerlukan rawak kualiti yang lebih tinggi, anda boleh menggunakan penjana nombor rawak yang disediakan dalam

, seperti yang ditunjukkan di bawah:

Thread Security:

System.Random System.Security.Cryptography Untuk memastikan rawak benang dengan selamat, kaedah pengembangan yang diubah suai berikut mesti dipertimbangkan:

<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)byte.MaxValue * (double)n / (double)uint.MaxValue)));
            int k = (int)(box[0] / ((double)byte.MaxValue / n));
            T value = list[k];
            list[k] = list[n - 1];
            list[n - 1] = value;
        }
    }
}</code>

di antara mereka ditakrifkan sebagai:

Melalui kaedah ini, anda boleh memilih kaedah penyortiran rawak yang paling sesuai mengikut keperluan anda. Sila ambil perhatian bahawa kepentingan apabila menggunakan

untuk memastikan pembebasan sumber yang betul.

Atas ialah kandungan terperinci Bagaimanakah saya dapat mengikat senarai dengan cekap dalam 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