Подтвердить что ты не робот

Генерировать случайное перечисление в С# 2.0

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

Спасибо!

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);
}
4b9b3361

Ответ 1

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) является эксклюзивным.

Ответ 2

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

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

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

Ответ 3

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);
}

Ответ 4

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

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 кашель) не обеспечивают такой массив, поэтому вышеприведенное достаточно, чтобы я все равно оставил его.

Ответ 5

Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()