如何从枚举中选择随机值?

maf*_*afu 160 c# random enums

给定C#中的任意枚举,如何选择随机值?

(我没有在SO上找到这个非常基本的问题.我会在一分钟内发布我的答案作为参考,但是请随时发表你自己的答案.)

Dar*_*rov 267

Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));
Run Code Online (Sandbox Code Playgroud)

  • 确保你不要在紧密循环中继续重新创建`random` - 否则你将继续得到相同的值. (36认同)
  • @uriDium不,参数指定哪个值是第一个太大而无法返回(即_max减1_) (6认同)
  • 您不需要减去任何东西。Random.Next() 返回一个小于指定最大值的随机整数。如果进行减法,您将永远无法获得枚举中的最后一个值。 (3认同)
  • 那应该是 random.Next(values.Length -1) 吗? (2认同)
  • DarinDimitrov IMO @ChrisF 的第一条评论应该是答案中的一条注释,并注明克里斯。 (2认同)

maf*_*afu 56

使用Enum.GetValues检索所有值的数组.然后选择一个随机数组项.

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

测试:

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

- >

Tuesday
Saturday
Wednesday
Monday
Friday
Saturday
Saturday
Saturday
Friday
Wednesday
Run Code Online (Sandbox Code Playgroud)

更新:此答案最初用于OrderBy (x => _Random.Next()).FirstOrDefault ()选择随机元素.只有在你被随意键改变而非理性地吸引时才使用它.在任何其他情况下,请使用Darin Dimitrov接受的答案,我将在稍后的答案中加入.

  • `GetValues` 现在支持类型提示。`Enum.GetValues&lt;T&gt;()`,甚至更简洁。 (4认同)

Aar*_*don 7

这是作为Extension Methodusing的替代版本LINQ

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());
        }
    }           
}
Run Code Online (Sandbox Code Playgroud)












小智 7

改编为 Random 类扩展:

public static class RandomExtensions
{   
    public static T NextEnum<T>(this Random random)
        where T : struct, Enum
    {
        var values = Enum.GetValues<T>();

        return values[random.Next(values.Length)];
    }
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

var random = new Random();
var myEnumRandom = random.NextEnum<MyEnum>();
Run Code Online (Sandbox Code Playgroud)


Bre*_*tti 5

你可以这样做:

var rnd = new Random();
return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length);
Run Code Online (Sandbox Code Playgroud)

无需存储数组

  • @BojidarStanchev您隐含的某人将其复制粘贴到循环中而不将代码适应其用例的情况不是答案或问题的问题,而是您自己错误应用解决方案的问题。 (2认同)