24

ランダムな列挙型メンバーを生成するためのよりクリーンな方法を教えてください。これは機能しますが、醜いようです。

ありがとう!

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

5 に答える 5

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

Random.Next(min,max) の最大値が排他的であることを指摘してくれた @[Marc Gravell] に感謝します。

于 2008-11-26T05:22:42.147 に答える
15

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

静的フィールドの場合は、アクセスを同期する必要があります。

于 2008-11-26T05:32:59.227 に答える
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);
}
于 2009-12-15T21:16:41.590 に答える
0
Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()
于 2012-01-05T03:06:51.360 に答える
0

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) はその配列を提供しないため、上記は十分に役立つので、とにかくそのままにしておきます。

于 2008-11-26T06:00:52.180 に答える