当前位置:  开发笔记 > 编程语言 > 正文

在C#2.0中生成随机枚举

如何解决《在C#2.0中生成随机枚举》经验,为你挑选了2个好方法。

有人可以请我指向一个更简洁的方法来生成随机枚举成员.这有效,但看起来很难看.

谢谢!

public T RandomEnum()
{
  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);
}

Mark Cidade.. 43

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

感谢@ [Marc Gravell],他们认为Random.Next(min,max)中的max是独占的.



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

感谢@ [Marc Gravell],他们认为Random.Next(min,max)中的max是独占的.


当然在实际的实现中你不希望每次调用都使用一个新的Random(特别是如果你经常调用它),我个人想要缓存数组.
请注意这个答案是有缺陷的.正如之前所说,如果这一代紧密相连,这将导致根本没有随机性.

2> Marc Gravell..:

Marxidad的答案很好(注意你只需要Next(0,values.Length),因为上限是排他的) - 但要注意时间.如果你在紧密的循环中这样做,你会得到很多重复.为了使其更随机,请考虑将Random对象保留在字段中 - 即

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

如果是静态字段,则需要同步访问权限.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有