Генерируйте случайное перечисление в C# 2.0

Вы можете использовать ключевое слово dynamic

dynamic obj = JsonConvert.DeserializeObject(json);
Console.WriteLine(obj.unashamedohio.summonerLevel);
24
задан Mihai Limbășan 29 November 2008 в 10:28
поделиться

5 ответов

public T RandomEnum<T>()
{ 
  T[] values = (T[]) Enum.GetValues(typeof(T));
  return values[new Random().Next(0,values.Length)];
}

Спасибо @ [Marc Gravell] за сообщение о том, что max в Random.Next (min, max) является эксклюзивным.

43
ответ дан Mark Cidade 16 October 2019 в 08:14
поделиться

Ответ Marxidad хорош (обратите внимание, что Вам только нужно Next(0,values.Length), так как верхняя граница эксклюзивна) - но не упустите синхронизацию. Если Вы сделаете это в жестком цикле, Вы получите много повторений. Для создания его более случайным рассмотрите хранение Случайного объекта в поле - т.е.

private Random rand = new Random();
public T RandomEnum<T>()
{ 
  T[] values = (T[]) Enum.GetValues(typeof(T));
  return values[rand.Next(0,values.Length)];
}

, Если это будет статическое поле, необходимо будет синхронизировать доступ.

15
ответ дан Marc Gravell 16 October 2019 в 08:14
поделиться

Silverlight не имеет GetValues ​​(), но вы можете использовать отражение, чтобы получить случайное перечисление.

private Random rnd = new Random();

public T RndEnum<T>()
{
    FieldInfo[] fields = typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public);

    int index = rnd.Next(fields.Length);

    return (T) Enum.Parse(typeof(T), fields[index].Name, false);
}
3
ответ дан pixie 16 October 2019 в 08:14
поделиться

Я не уверен в c#, но другие языки позволяют разрывы в перечислимых значениях. Составлять это:

enum A {b=0,c=2,d=3,e=42};

switch(rand.Next(0,4))
{
   case 0: return A.b;
   case 1: return A.c;
   case 2: return A.d;
   case 3: return A.e;
}

майор вниз сторона совершенствует его!

Не рядом как аккуратный, но более корректный в том угловом случае.

<час>

, Как указано, примеры от вышеупомянутого индекса в массив допустимых значений и это разбирается в нем. OTOH, который некоторые языки ( кашель кашель D ) не обеспечивают тому массиву так вышеупомянутое, достаточно полезен, что я оставлю его так или иначе.

0
ответ дан BCS 16 October 2019 в 08:14
поделиться
Enum.Parse(typeof(SomeEnum), mRandom.Next(min, max).ToString()).ToString()
0
ответ дан Alex 16 October 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: