来自 C# 枚举变量的随机值

Random value from c# enum variable

有没有一种简单的方法可以让我从我的枚举变量中 select 一个随机位值?
例如:

[System.Flags]
public enum Direction{
    None = 0,
    Up = 1,
    Down = 2, 
    Left = 4, 
    Right = 8,
    All = ~None
}

public Direction someDir = Direction.Up | Direction.Down;

我想要 select 来自 someDir 的随机正位值,这样我只能有 Direction.UpDirection.Down?

你应该使用数组:

Direction validDirections = new[] { Direction.Up, Direction.Down };

然后:

Random rnd = new Random();
Direction selectedDirection = validDirections[rnd.Next(validDirections.Length)];

(记得重复使用相同的 Random rnd 而不是每次都重新创建它)

如果你真的想要一个单一的 Direction 变量,那么你可以将它拆分为 List<Direction>:

Direction someDir = Direction.Up | Direction.Down;

var someDir2 = new List<Direction>();

foreach (Direction dir in Enum.GetValues(typeof(Direction)))
{
    if (someDir.HasFlag(dir))
    {
        someDir2.Add(dir);
    }
}

Random rnd = new Random();
Direction selectedDirection = someDir2[rnd.Next(someDir2.Count)];

(参见 Most efficient way to parse a flagged enum to a list 和关于使用 HasFlag 的各种评论)