Générer l'énum aléatoire en C # 2.0

quelqu'un pourrait-il s'il vous plaît me diriger vers une méthode plus propre pour générer un membre d'enum aléatoire. Cela fonctionne, mais semble laid.

Merci!

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);
}
23
demandé sur Mihai Limbășan 2008-11-26 08:15:23

5 réponses

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

merci à @[Marc Gravell] d'avoir réfléchi à ce max au hasard.Prochaine(min,max) est exclusif.

40
répondu Mark Cidade 2008-11-26 05:33:27

la réponse de Marxidad est bonne (notez que vous n'avez besoin que de Next(0,values.Length), puisque la limite supérieure est exclusive) - mais attention au timing. Si vous le faites dans une boucle serrée, vous obtiendrez beaucoup de répétitions. Pour le rendre plus aléatoire, pensez à garder L'Objet aléatoire dans un champ-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)];
}

Si c'est un champ statique, vous devez synchroniser l'accès.

14
répondu Marc Gravell 2008-11-26 05:32:59

Silverlight n'a pas GetValues(), mais vous pouvez utiliser la réflexion pour obtenir un enum aléatoire à la place.

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);
}
3
répondu pixie 2009-12-15 22:30:32

Je ne suis pas sûr de c# mais d'autres langues permettent des écarts dans les valeurs d'enum. De tenir compte de cela:

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

Le principal inconvénient est la mise à jour!

pas aussi soigné mais plus correct dans cette affaire de coin.


comme indiqué, les exemples ci-dessus indexent dans un tableau de valeurs valides et cela le droit. OTOH quelques langues (toux D toux) ne donnent pas de tableau ci-dessus est utile assez pour que je le laisse de toute façon.

0
répondu BCS 2008-11-26 06:43:20
Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()
0
répondu Alex 2012-01-05 03:06:51