Как выбрать случайное значение из перечисления?
дано произвольное перечисление в C#, Как выбрать случайное значение?
(Я не нашел этот очень простой вопрос на SO. Я опубликую свой ответ через минуту в качестве ссылки для всех, но, пожалуйста, не стесняйтесь публиковать свой собственный ответ.)
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