Tengo una ArrayList y necesito poder hacer clic en un botón y luego seleccionar aleatoriamente una cadena de esa lista y mostrarla en un cuadro de mensaje.
¿Cómo haría para hacer esto?
Crea una instancia de Random
clase en alguna parte. Tenga en cuenta que es bastante importante no crear una nueva instancia cada vez que necesite un número aleatorio. Debe reutilizar la instancia anterior para lograr uniformidad en los números generados. Puede tener un static
campo en alguna parte (tenga cuidado con los problemas de seguridad del hilo):
static Random rnd = new Random();
Pídale a la Random
instancia que le dé un número aleatorio con el máximo de la cantidad de elementos en ArrayList
:
int r = rnd.Next(list.Count);
Mostrar la cadena:
MessageBox.Show((string)list[r]);
Next(max)
llamada es exclusivo.Usualmente uso esta pequeña colección de métodos de extensión:
Para una lista fuertemente tipada, esto le permitiría escribir:
Si todo lo que tiene es una ArrayList, puede lanzarla:
fuente
return list[rnd.Next(list.Count)];
Random
en estado estático en su lugar.Tu puedes hacer:
fuente
Crea una
Random
instancia:Obtener una cadena aleatoria:
Sin embargo, recuerde que si hace esto con frecuencia, debe reutilizar el
Random
objeto. Póngalo como campo estático en la clase para que se inicialice solo una vez y luego acceda a él.fuente
O una clase de extensión simple como esta:
Entonces solo llame:
Funciona para matrices también.
Evitaría llamar
OrderBy()
ya que puede ser costoso para colecciones más grandes. Utilice colecciones indexadas comoList<T>
o matrices para este propósito.fuente
IList
por lo que la segunda sobrecarga es innecesaria.Por qué no:
fuente
fuente
maxValue
parámetro del métodoNext
debe ser solo un número de elementos en una lista, no menos uno, porque de acuerdo con una documentación " maxValue es el límite superior exclusivo del número aleatorio ".He estado usando este ExtensionMethod por un tiempo:
fuente
Sugeriré un enfoque diferente, si el orden de los elementos dentro de la lista no es importante en la extracción (y cada elemento debe seleccionarse solo una vez), entonces, en lugar de uno
List
, puede usar unoConcurrentBag
que es una colección desordenada y segura de hilos objetos:El manejador de eventos:
El
TryTake
intentará extraer un objeto "al azar" de la colección no ordenada.fuente
Necesitaba más elementos en lugar de solo uno. Entonces, escribí esto:
Con esto, puede obtener elementos cuántos desea de forma aleatoria como esta:
fuente
Imprimir al azar el nombre del país desde el archivo JSON.
Modelo:
Implementación:
fuente
Por qué no [2]:
fuente