Câu trả lời:
Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));
Sử dụng Enum.GetValues để lấy một mảng của tất cả các giá trị. Sau đó chọn một mục mảng ngẫu nhiên.
static Random _R = new Random ();
static T RandomEnumValue<T> ()
{
var v = Enum.GetValues (typeof (T));
return (T) v.GetValue (_R.Next(v.Length));
}
Kiểm tra:
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
Bạn chỉ có thể làm điều này:
var rnd = new Random();
return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length);
Không cần lưu trữ mảng
GetNames
trả về một mảng.
Đây là một phiên bản thay thế như là Extension Method
sử dụng 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());
}
}
}
Hai
Một
Bốn
Bốn
Bốn
Ba
Hai
Bốn
Một
Ba
Gọi Enum.GetValues
; cái này trả về một mảng đại diện cho tất cả các giá trị có thể cho enum của bạn. Chọn một mục ngẫu nhiên từ mảng này. Đúc mục đó trở lại loại enum ban đầu.
Đây là một chức năng chung cho nó. Giữ việc tạo RNG bên ngoài mã tần số cao.
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);
}
}
Ví dụ sử dụng:
System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>();
Cá nhân tôi là một fan hâm mộ của các phương thức mở rộng, vì vậy tôi sẽ sử dụng một cái gì đó như thế này (trong khi không thực sự là một tiện ích mở rộng, nó trông tương tự):
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);
}
}
}
public static T Of<T>() where T : Enum
docs.microsoft.com/en-us/visualstudio/releasenotes/ trộm
Thích nghi như một phần mở rộng lớp ngẫu nhiên:
public static class RandomExtensions
{
public static T NextEnum<T>(this Random random)
{
var values = Enum.GetValues(typeof(T));
return (T)values.GetValue(random.Next(values.Length));
}
}
Ví dụ về cách sử dụng:
var random = new Random();
var myEnumRandom = random.NextEnum<MyEnum>();
Bạn cũng có thể truyền một giá trị ngẫu nhiên:
using System;
enum Test {
Value1,
Value2,
Value3
}
class Program {
public static void Main (string[] args) {
var max = Enum.GetValues(typeof(Test)).Length;
var value = (Test)new Random().Next(0, max - 1);
Console.WriteLine(value);
}
}
Nhưng bạn nên sử dụng một bộ ngẫu nhiên tốt hơn như cái trong thư viện này của tôi.
random
trong một vòng lặp chặt chẽ - nếu không bạn sẽ tiếp tục nhận được cùng một giá trị.