【问题标题】:How to get Random values for LogicalTypes如何获取 LogicalTypes 的随机值
【发布时间】:2011-02-03 10:10:18
【问题描述】:

我有一个生成实体的工具,我需要生成一个用于测试的 samlpe 值。问题是我们有很多逻辑类型(一些相同的类型但仍然不同)并且在编码之前我想知道是否有人有更简单的解决方案......

这里是枚举:

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

谢谢!!!

编辑 1:我想生成一个随机值,而不是从枚举中获取随机元素。我正在寻找一种获取随机电子邮件或邮政编码或货币价值的方法。

【问题讨论】:

  • 比什么更简单的解决方案?我假设您有一个您认为无效的解决方案,请将其发布并让我们看看。 :)
  • 写一个 randomString randomDouble randomInt randomDateTime ^^
  • 要获得每种类型的随机值,让我感到震惊的是,您需要了解哪些信息对它们中的每一个都有效,并为它们单独创建一个随机生成器。您可能可以在其中一些上重用代码(例如,评论和标题听起来像同一个随机发生器会起作用)但我看不出随机生成日期时间和电子邮件地址的共同点......

标签: c# random-sample


【解决方案1】:

我认为您必须将答案分为两部分:

首先从列表中获取一个随机枚举类型。我认为这部分已经通过提供的其他答案解决了。

之后,您想为选定的枚举创建一个随机值列表。因此,您需要一个可以为每种类型创建有效随机值的工厂。最接近您需求的应该是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&lt;...Source&gt;())。 项目中已经有一些默认源,但我自己也做了一些,如下所示:

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;
    }
}

因此,您可以为每种类型创建自己的源代码,然后轻松创建一堆示例对象。

【讨论】:

    【解决方案2】:

    您可以创建一个从 0 到枚举项目计数的随机数(您可以通过 Enum.GetNames().Length 获取它们),然后将该数字转换为您的 LogicalTypeEnum

    【讨论】:

      【解决方案3】:

      您可以使用以下代码 sn-p 来实现(注意:这仅适用于 1 个随机值,为下一个项目重用 Random 生成器和 enumItemsCount ;))

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

      【讨论】:

        猜你喜欢
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        相关资源
        最近更新 更多