2011-02-03 9 views
5

Tengo una herramienta que genera entidades. Necesito generar un valor samlpe para probar. el problema es que tenemos un montón de tipos lógicos (algunos del mismo tipo, pero sigue siendo diferente) y se acaben de codificación que quería saber si alguien tiene una solución más fácil ...Cómo obtener valores aleatorios para LogicalTypes

Aquí es la enumeración:

public enum LogicalTypeEnum 
    { 
     Identity, 
     DateAndTime, 
     Binary, 
     Quantity, 
     Comment, 
     Money, 
     Rate, 
     TimeStamp, 
     Caption, 
     Reference, 
     Number, 
     Weight, 
     Space, 
     Username, 
     Phone, 
     Email, 
     ZipCode 
    } 

Gracias !!!

EDITAR 1: Quiero generar un valor aleatorio para no obtener un elemento aleatorio de la enumeración. Estoy buscando una manera de obtener un correo electrónico o código postal o valor monetario al azar.

+0

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

+0

échale un vistazo aquí: http://stackoverflow.com/questions/319814/generate-random-enum-in-c-2-0 –

+0

más fácil que escribir un randomString randomDoble randomInt randomDateTime ^^ – Polo

Respuesta

5

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.

1

puede crear un número aleatorio de 0 a recuento de artículos enumerados (puede obtenerlos por Enum.GetNames().Length), y luego emitir el número a su LogicalTypeEnum.

1

Se podía hacerlo con el siguiente fragmento de código (nota: esto es sólo para 1 valor aleatorio, reutilizar el generador aleatorio y enumItemsCount para el siguiente elemento;))

var r = new Random(); 
int enumItemsCount = Enum.GetValues(typeof(LogicalTypeEnum)).Length; 
LogicalTypeEnum randomLogicalType = (LogicalTypeEnum)r.Next(enumItemsCount - 1); 
Cuestiones relacionadas