Yo creo que hay que dividir su respuesta en dos partes:
Primero obtenga un tipo de enumeración aleatorio fuera de la lista. Creo que esta parte ya está resuelta por las otras respuestas proporcionadas.
A continuación, desea crear una lista de valores aleatorios para la enumeración seleccionada. Por lo tanto, necesita una fábrica que pueda crear un valor aleatorio válido para cada uno de estos tipos. Lo que más se acerca a sus necesidades debe ser AutoPoco. Es muy fácil crear un montón de objeto de muestra se llenó de algunos valores que le gustan por ejemplo
var factory = AutoPoco.AutoPocoContainer.Configure(x =>
{
x.Conventions(c =>
{
c.UseDefaultConventions();
});
x.Include<DataRowWrapper>()
.Setup(row => row.Timestamp).Use<DateTimeUniqueSource>()
.Setup(row => row.Name).Use<LastNameSource>()
.Setup(row => row.Value).Use<ApproximateNumberSource<decimal>>()
.Setup(row => row.Description).Use<RandomReadableStringSource>(10, 20);
});
var session = factory.CreateSession();
var sampleRows = session.List<DataRowWrapper>(1000).Get();
Como se puede ver que se puede brindar para cada propiedad de su propia fuente (.Use<...Source>()
). ya hay algunas fuentes predeterminadas dentro del proyecto, pero también hice algunos en mi propia como la siguiente:
public class RandomReadableStringSource : DatasourceBase<string>
{
private readonly char[] _Vocals = new char[] { 'a', 'e', 'i', 'o', 'u' };
private readonly char[] _Consonants = new char[] { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w' };
private Random _Random;
private int _Minimum;
private int _Maximum;
public RandomReadableStringSource()
: this(20)
{ }
public RandomReadableStringSource(int max)
: this(5, max)
{ }
public RandomReadableStringSource(int min, int max)
{
if (min <= 0)
{
throw new ArgumentOutOfRangeException("minimum must be greater zero.");
}
if (min > max)
{
throw new ArgumentOutOfRangeException("minimum must be less or equal maximum.");
}
_Random = new Random();
_Minimum = min;
_Maximum = max;
}
public override string Next(IGenerationSession session)
{
var length = _Random.Next(_Minimum, _Maximum);
var sb = new StringBuilder(length);
for (int i = 0; i < length; i++)
{
var array = i % 2 == 0 ? _Consonants : _Vocals;
sb.Append(array[_Random.Next(array.Length)]);
}
return sb.ToString();
}
}
public class DateTimeUniqueSource : DatasourceBase<DateTime>
{
private Random _Random;
private DateTime _LastDateTime;
public DateTimeUniqueSource()
: this(new DateTime(1900, 1, 1))
{ }
public DateTimeUniqueSource(DateTime startdate)
{
if (startdate == null)
{
throw new ArgumentNullException("startdate");
}
_Random = new Random();
_LastDateTime = startdate;
}
public override DateTime Next(IGenerationSession session)
{
_LastDateTime = _LastDateTime.AddHours(_Random.NextDouble() * 1000);
return _LastDateTime;
}
}
por lo que podría crear su propia fuente para cada tipo y después bastante fácil crear un montón de objetos de muestra.
solución más fácil que qué? Supongo que tiene una solución que cree que es ineficaz, publíquela y déjenos ver. :) – Chris
échale un vistazo aquí: http://stackoverflow.com/questions/319814/generate-random-enum-in-c-2-0 –
más fácil que escribir un randomString randomDoble randomInt randomDateTime ^^ – Polo