열거 형에서 임의의 값을 어떻게 선택합니까?
C #에 임의의 열거가 주어지면 임의의 값을 어떻게 선택합니까?
(나는이 기본적인 질문을 찾지 못했습니다. 누군가를위한 참고 자료로 1 분 안에 답변을 게시 할 것이지만 자신의 답변을 자유롭게 게시하십시오.)
Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));
Enum.GetValues를 사용하여 모든 값의 배열을 검색하십시오. 그런 다음 임의의 배열 항목을 선택하십시오.
static T RandomEnumValue<T> ()
{
var v = Enum.GetValues (typeof (T));
return (T) v.GetValue (new Random ().Next(v.Length));
}
테스트:
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
업데이트 :이 답변은 원래 OrderBy (x => _Random.Next()).FirstOrDefault ()
임의의 요소를 선택하는 데 사용 되었습니다. 임의의 키로 셔플 링에 합리적으로 끌리는 경우에만 사용하십시오. 다른 경우에는 대신 Darin Dimitrov가 수락 한 답변을 사용하십시오.이 답변은 나중에이 답변에 통합되었습니다.
당신은 이것을 할 수 있습니다 :
var rnd = new Random();
return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length);
어레이를 저장할 필요가 없습니다
전화 Enum.GetValues
; 이것은 열거 형에 가능한 모든 값을 나타내는 배열을 반환합니다. 이 배열에서 임의의 항목을 선택하십시오. 해당 항목을 원래 열거 형 유형으로 다시 캐스팅하십시오.
다음은 일반적인 기능입니다. RNG 생성을 고주파 코드 외부에 유지하십시오.
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);
}
}
사용 예 :
System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>();
다음은 Extension Method
using 과 같은 대체 버전 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());
}
}
}
2
1
4
4
4
3
2
4
1
3
개인적으로 저는 확장 방법의 팬이므로 다음과 같은 것을 사용합니다 (실제 확장은 아니지만 비슷하게 보입니다).
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);
}
}
}
참고 URL : https://stackoverflow.com/questions/3132126/how-do-i-select-a-random-value-from-an-enumeration
'Programing' 카테고리의 다른 글
문자열이 유효한 DateTime "형식 dd / MM / yyyy"로 인식되지 않았습니다. (0) | 2020.06.05 |
---|---|
혼합 모드 어셈블리는 런타임 버전 'v2.0.50727'에 대해 빌드됩니다. (0) | 2020.06.05 |
"루비 설치에 정신이 없습니다"오류를 해결하는 방법? (0) | 2020.06.05 |
각도 지시문이 지시문 속성에 지정된 표현식의 함수에 인수를 전달할 수 있습니까? (0) | 2020.06.05 |
random.seed () : 무엇을합니까? (0) | 2020.06.05 |