Случайное значение из переменной перечисления С#

Есть ли простой способ выбрать случайное значение бита из моей переменной enum?
Например:

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

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

Я хотел бы выбрать случайное положительное значение бита из someDir, чтобы я мог иметь только Direction.Up или Direction.Down?


person Alec Gamble    schedule 21.03.2017    source источник
comment
var gen = новый случайный(); var upOrDown = (Направление) (gen.Next(1)+1);   -  person mukh1n    schedule 21.03.2017
comment
ну, я хочу получить новое направление, которое является одним из значений в переменной someDir, чтобы в конечном итоге я получил Direction.Up или Direction.Down или одно из любых значений, хранящихся в someDir.   -  person Alec Gamble    schedule 21.03.2017


Ответы (1)


Вы должны использовать массив:

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)];

(см. Самый эффективный способ анализа помеченного перечисления в список и различные комментарии об использовании HasFlag)

person xanatos    schedule 21.03.2017
comment
хорошо, спасибо :) Я имею в виду, что ни одна из них не похожа на чистую реализацию, которую я хотел, но я понимаю ограничения и буду работать с этим. Большое спасибо! :) - person Alec Gamble; 21.03.2017