Как получить случайные значения для логических типов


У меня есть инструмент, который генерирует сущности, необходимые для генерации значения samlpe для тестирования. проблема в том, что у нас есть много логических типов (некоторые из того же типа, но все же разные), и для кодирования я хотел бы знать, есть ли у кого-то более простое решение...

Вот перечисление:

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

Спасибо!!!

Правка 1: я хочу сгенерировать случайное значение, а не получить случайный элемент из перечисления. Я ищу способ получить случайное электронное письмо или почтовый индекс или денежную ценность.

3 5

3 ответа:

Я думаю, что вы должны разделить свой ответ на две части:

Сначала получите случайный тип перечисления из списка. Я думаю, что эта часть уже решена другими предоставленными ответами.

После этого вы хотите создать список случайных значений для выбранного перечисления. Поэтому вам нужна фабрика, которая может создать допустимое случайное значение для каждого из этих типов. То, что ближе всего подходит к вашим потребностям, должно быть AutoPoco. Довольно легко создать кучу образцов объекта, заполненных некоторые значения, которые вам нравятся, например

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();
Как вы можете видеть, вы можете предоставить для каждого свойства свой собственный источник (.Use<...Source>()). В проекте уже есть некоторые источники по умолчанию, но я также сделал некоторые самостоятельно, например:
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;
    }
}

Таким образом, вы можете создать свой собственный источник для каждого типа, а затем довольно легко создать кучу образцов объектов.

Вы можете создать случайное число от 0 до enum items count (вы можете получить их по Enum.GetNames().Length), а затем привести число к вашему LogicalTypeEnum.

Вы можете сделать это с помощью следующего фрагмента кода (Примечание: это только для 1 случайного значения, повторно используйте генератор случайных чисел и enumItemsCount для следующего элемента;))

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