如何从枚举中select一个随机值?

鉴于在C#中的任意枚举,我该如何select一个随机值?

(我没有在这个问题上find这个基本的问题,我会在一分钟之内发表我的答案作为任何人的参考,但请随时发表你自己的答案。)

Array values = Enum.GetValues(typeof(Bar)); Random random = new Random(); Bar randomBar = (Bar)values.GetValue(random.Next(values.Length)); 

使用Enum.GetValues来检索所有值的数组。 然后select一个随机数组项目。

 static T RandomEnumValue<T> () { var v = Enum.GetValues (typeof (T)); return (T) v.GetValue (new Random ().Next(v.Length)); } 

testing:

 for (int i = 0; i < 10; i++) { var value = RandomEnumValue<System.DayOfWeek> (); Console.WriteLine (value.ToString ()); } 

– >

 Tuesday Saturday Wednesday Monday Friday Saturday Saturday Saturday Friday Wednesday 

更新:这个答案最初使用OrderBy (x => _Random.Next()).FirstOrDefault ()来select一个随机元素。 只有当你被不合理的吸引力用随机键洗牌时才使用它。 在任何其他情况下,请使用Darin Dimitrov接受的答案,而不是在后面的答案中。

调用Enum.GetValues ; 这将返回一个数组,代表您的枚举的所有可能的值。 从这个数组中select一个随机项目。 将该项目转换回原始的枚举types。

这是一个通用的function。 保持RNG创build在高频代码之外。

 public static Random RNG = new Random(); public static T RandomEnum<T>() { Type type = typeof(T); Array values = Enum.GetValues(type); lock(RNG) { object value= values.GetValue(RNG.Next(values.Length)); return (T)Convert.ChangeType(value, type); } } 

用法示例:

 System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>(); 

你可以这样做:

 var rnd = new Random(); return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length); 

不需要存储数组

就个人而言,我是扩展方法的粉丝,所以我会使用这样的东西(虽然不是一个扩展,它看起来类似):

 public enum Options { Zero, One, Two, Three, Four, Five } public static class RandomEnum { private static Random _Random = new Random(Environment.TickCount); public static T Of<T>() { if (!typeof(T).IsEnum) throw new InvalidOperationException("Must use Enum type"); Array enumValues = Enum.GetValues(typeof(T)); return (T)enumValues.GetValue(_Random.Next(enumValues.Length)); } } [TestClass] public class RandomTests { [TestMethod] public void TestMethod1() { Options option; for (int i = 0; i < 10; ++i) { option = RandomEnum.Of<Options>(); Console.WriteLine(option); } } } 

这是一个使用LINQExtension Method的替代版本。

 using System; using System.Linq; public static class EnumExtensions { public static Enum GetRandomEnumValue(this Type t) { return Enum.GetValues(t) // get values from Type provided .OfType<Enum>() // casts to Enum .OrderBy(e => Guid.NewGuid()) // mess with order of results .FirstOrDefault(); // take first item in result } } public static class Program { public enum SomeEnum { One = 1, Two = 2, Three = 3, Four = 4 } public static void Main() { for(int i=0; i < 10; i++) { Console.WriteLine(typeof(SomeEnum).GetRandomEnumValue()); } } }