Flags枚举的随机值

Chr*_*ter 5 c# enums enum-flags

假设我有一个接受使用Flags属性修饰的枚举的函数.如果枚举的值是多个枚举元素的组合,我如何随机提取其中一个元素?我有以下但似乎必须有一个更好的方法.

[Flags]
enum Colours
{
    Blue = 1,
    Red = 2,
    Green = 4
}

public static void Main()
{
    var options = Colours.Blue | Colours.Red | Colours.Green;
    var opts = options.ToString().Split(',');
    var rand = new Random();
    var selected = opts[rand.Next(opts.Length)].Trim();
    var myEnum = Enum.Parse(typeof(Colours), selected);
    Console.WriteLine(myEnum);
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 9

您可以调用Enum.GetValues以获取枚举定义值的数组,如下所示:

var rand = new Random();

Colors[] allValues = (Colors[])Enum.GetValues(typeof(Colors));
Colors value = allValues[rand.Next(allValues.Length)];
Run Code Online (Sandbox Code Playgroud)


Luk*_*keH 9

var options = Colours.Blue | Colours.Green;

var matching = Enum.GetValues(typeof(Colours))
                   .Cast<Colours>()
                   .Where(c => (options & c) == c)    // or use HasFlag in .NET4
                   .ToArray();

var myEnum = matching[new Random().Next(matching.Length)];
Run Code Online (Sandbox Code Playgroud)