Saya memiliki ArrayList, dan saya harus dapat mengklik tombol dan kemudian secara acak memilih string dari daftar itu dan menampilkannya di kotak pesan.
Bagaimana saya bisa melakukan ini?
Buat instance Random
kelas di suatu tempat. Perhatikan bahwa sangat penting untuk tidak membuat instance baru setiap kali Anda membutuhkan nomor acak. Anda harus menggunakan kembali instance lama untuk mencapai keseragaman dalam angka yang dihasilkan. Anda dapat memiliki static
bidang di suatu tempat (hati-hati dengan masalah keamanan utas):
static Random rnd = new Random();
Minta Random
instance untuk memberi Anda nomor acak dengan maksimum jumlah item dalam ArrayList
:
int r = rnd.Next(list.Count);
Tampilkan string:
MessageBox.Show((string)list[r]);
Next(max)
panggilan ini eksklusif.Saya biasanya menggunakan kumpulan kecil metode ekstensi ini:
Untuk daftar yang sangat diketik, ini memungkinkan Anda untuk menulis:
Jika yang Anda miliki hanyalah ArrayList, Anda dapat mengirimkannya:
sumber
return list[rnd.Next(list.Count)];
Random
dalam keadaan statis sebagai gantinya.Anda dapat melakukan:
sumber
Buat sebuah
Random
instance:Ambil string acak:
Ingat juga, bahwa jika Anda sering melakukan ini, Anda harus menggunakan kembali
Random
objek. Letakkan sebagai bidang statis di kelas sehingga hanya diinisialisasi satu kali dan kemudian mengaksesnya.sumber
Atau kelas ekstensi sederhana seperti ini:
Lalu panggil saja:
Berfungsi untuk array juga.
Saya akan menghindari menelepon
OrderBy()
karena bisa mahal untuk koleksi yang lebih besar. Gunakan koleksi yang diindeks sepertiList<T>
atau array untuk tujuan ini.sumber
IList
sehingga kelebihan kedua tidak perlu.Kenapa tidak:
sumber
sumber
maxValue
parameter metodeNext
harus hanya sejumlah elemen dalam daftar, bukan minus satu, karena menurut dokumentasi " maxValue adalah batas atas eksklusif dari nomor acak ".Saya telah menggunakan ExtensionMethod ini untuk sementara waktu:
sumber
Saya akan menyarankan pendekatan yang berbeda, Jika urutan item di dalam daftar tidak penting saat ekstraksi (dan setiap item harus dipilih hanya sekali), maka alih-alih
List
Anda dapat menggunakanConcurrentBag
yang merupakan koleksi thread-safe, unordered dari benda:EventHandler:
The
TryTake
akan berupaya mengambil sebuah "acak" objek dari koleksi unordered.sumber
Saya perlu lebih banyak barang, bukan hanya satu. Jadi, saya menulis ini:
Dengan ini, Anda bisa mendapatkan elemen berapa banyak yang Anda inginkan secara acak seperti ini:
sumber
Mencetak nama negara secara acak dari file JSON.
Model:
Implementaton:
sumber
Kenapa tidak [2]:
sumber