Генерация случайного перечисления в C # 2.0 - PullRequest
24 голосов
/ 26 ноября 2008

Может кто-нибудь указать мне на более чистый метод генерации случайного члена перечисления. Это работает, но кажется уродливым.

Спасибо!

public T RandomEnum<T>()
{
  string[] items = Enum.GetNames(typeof( T ));
  Random r = new Random();
  string e = items[r.Next(0, items.Length - 1)];
  return (T)Enum.Parse(typeof (T), e, true);
}

Ответы [ 5 ]

42 голосов
/ 26 ноября 2008
public T RandomEnum<T>()
{ 
  T[] values = (T[]) Enum.GetValues(typeof(T));
  return values[new Random().Next(0,values.Length)];
}

Спасибо @ [Marc Gravell] за сообщение о том, что max в Random.Next (min, max) является эксклюзивным.

15 голосов
/ 26 ноября 2008

Marxidad ответ хороший (обратите внимание, вам нужно только Next(0,values.Length), так как верхняя граница является эксклюзивной) - но следите за временем. Если вы сделаете это в тесной петле, вы получите много повторов. Чтобы сделать его более случайным, рассмотрите возможность сохранения объекта Random в поле, т.е.

private Random rand = new Random();
public T RandomEnum<T>()
{ 
  T[] values = (T[]) Enum.GetValues(typeof(T));
  return values[rand.Next(0,values.Length)];
}

Если это статическое поле, вам необходимо синхронизировать доступ.

3 голосов
/ 16 декабря 2009

Silverlight не имеет GetValues ​​(), но вы можете использовать отражение, чтобы получить случайное перечисление.

private Random rnd = new Random();

public T RndEnum<T>()
{
    FieldInfo[] fields = typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public);

    int index = rnd.Next(fields.Length);

    return (T) Enum.Parse(typeof(T), fields[index].Name, false);
}
0 голосов
/ 05 января 2012
Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()
0 голосов
/ 26 ноября 2008

Я не уверен насчет c #, но другие языки допускают пробелы в значениях перечисления. Для учета этого:

enum A {b=0,c=2,d=3,e=42};

switch(rand.Next(0,4))
{
   case 0: return A.b;
   case 1: return A.c;
   case 2: return A.d;
   case 3: return A.e;
}

Основным недостатком является поддержание его в актуальном состоянии!

Не так аккуратно, но правильнее в этом угловом случае.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...