¿Cómo selecciono un valor aleatorio de una enumeración?
Dada una enumeración arbitraria en C#, ¿cómo selecciono un valor aleatorio?
(No encontré esta pregunta tan básica en SO. Publicaré mi respuesta en un minuto como referencia para cualquiera, pero no dude en publicar su propia respuesta).
Aceptado
Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));
Utilice Enum.GetValues para recuperar una matriz de todos los valores. Luego seleccione un elemento de matriz aleatorio.
static Random _R = new Random ();
static T RandomEnumValue<T> ()
{
var v = Enum.GetValues (typeof (T));
return (T) v.GetValue (_R.Next(v.Length));
}
Prueba:
for (int i = 0; i < 10; i++) {
var value = RandomEnumValue<System.DayOfWeek> ();
Console.WriteLine (value.ToString ());
}
->
Tuesday
Saturday
Wednesday
Monday
Friday
Saturday
Saturday
Saturday
Friday
Wednesday
Aquí hay una versión alternativa como Extension Method
usando LINQ
.
using System;
using System.Linq;
public static class EnumExtensions
{
public static Enum GetRandomEnumValue(this Type t)
{
return Enum.GetValues(t) // get values from Type provided
.OfType<Enum>() // casts to Enum
.OrderBy(e => Guid.NewGuid()) // mess with order of results
.FirstOrDefault(); // take first item in result
}
}
public static class Program
{
public enum SomeEnum
{
One = 1,
Two = 2,
Three = 3,
Four = 4
}
public static void Main()
{
for(int i=0; i < 10; i++)
{
Console.WriteLine(typeof(SomeEnum).GetRandomEnumValue());
}
}
}
Dos
Uno
Cuatro
Cuatro
Cuatro
Tres
Dos
Cuatro
Uno
Tres
Adaptado como una extensión de clase aleatoria:
public static class RandomExtensions
{
public static T NextEnum<T>(this Random random)
where T : struct, Enum
{
var values = Enum.GetValues<T>();
return values[random.Next(values.Length)];
}
}
Ejemplo de uso:
var random = new Random();
var myEnumRandom = random.NextEnum<MyEnum>();