¿Cómo selecciono un valor aleatorio de una enumeración?

Resuelto mafu asked hace 14 años • 11 respuestas

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

mafu avatar Jun 28 '10 18:06 mafu
Aceptado
Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));
Darin Dimitrov avatar Jun 28 '2010 12:06 Darin Dimitrov

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
mafu avatar Jun 28 '2010 12:06 mafu

Aquí hay una versión alternativa como Extension Methodusando 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

Aaron Hudon avatar Jan 16 '2017 22:01 Aaron Hudon

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>();
borja garcia avatar Mar 25 '2020 10:03 borja garcia