请问是否有更简洁的方法来生成随机枚举成员?下面的方法可以实现,但看起来不够优雅。
谢谢!
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);
}
public T RandomEnum<T>()
{
T[] values = (T[]) Enum.GetValues(typeof(T));
return values[new Random().Next(0,values.Length)];
}
感谢@[Marc Gravell]指出Random.Next(min,max)中的max是不包括在内的。
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)];
}
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);
}
我不确定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;
}
主要的缺点是保持它的最新状态!
不太整洁,但在那个角落的情况下更正确。
Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()