Как выбрать случайное значение из перечисления?



дано произвольное перечисление в C#, Как выбрать случайное значение?



(Я не нашел этот очень простой вопрос на SO. Я опубликую свой ответ через минуту в качестве ссылки для всех, но, пожалуйста, не стесняйтесь публиковать свой собственный ответ.)

1079   7  

7 ответов:

Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));

Использовать Перечисление.GetValues для получения массива всех значений. Затем выберите элемент случайного массива.

static T RandomEnumValue<T> ()
{
    var v = Enum.GetValues (typeof (T));
    return (T) v.GetValue (new Random ().Next(v.Length));
}

вызов Enum.GetValues; Это возвращает массив, который содержит все возможные значения перечисления. Выбрать случайный элемент из этого массива. Приведите этот элемент обратно к исходному типу перечисления.

вот общая функция для него. Держите создание ГСЧ за пределами высокочастотного кода.

public static Random RNG = new Random();

public static T RandomEnum<T>()
{  
    Type type = typeof(T);
    Array values = Enum.GetValues(type);
    lock(RNG)
    {
        object value= values.GetValue(RNG.Next(values.Length));
        return (T)Convert.ChangeType(value, type);
    }
}

пример использования:

System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>();

вы могли бы просто сделать это:

var rnd = new Random();
return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length);

нет необходимости хранить массивы

лично я поклонник методов расширения, поэтому я бы использовал что-то вроде этого (хотя на самом деле это не расширение, оно похоже):

public enum Options {
    Zero,
    One,
    Two,
    Three,
    Four,
    Five
}

public static class RandomEnum {
    private static Random _Random = new Random(Environment.TickCount);

    public static T Of<T>() {
        if (!typeof(T).IsEnum)
            throw new InvalidOperationException("Must use Enum type");

        Array enumValues = Enum.GetValues(typeof(T));
        return (T)enumValues.GetValue(_Random.Next(enumValues.Length));
    }
}

[TestClass]
public class RandomTests {
    [TestMethod]
    public void TestMethod1() {
        Options option;
        for (int i = 0; i < 10; ++i) {
            option = RandomEnum.Of<Options>();
            Console.WriteLine(option);
        }
    }

}

вот альтернативная версия как Extension Method С помощью 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());
        }
    }           
}

два
Один
Четыре
Четыре
Четыре
Три
Два
Четыре
Один
Три

Comments

    Ничего не найдено.