2011-02-03 78 views
5

我有一個工具可以生成我需要爲測試生成samlpe值的實體。問題是,我們有很多的邏輯類型(一些相同類型的,但仍然是不同的),並befor編碼我想知道,如果有人有一個簡單的解決方案...如何獲得LogicalTypes的隨機值

這裏是枚舉:

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

謝謝!

編輯1:我想生成一個隨機值沒有從枚舉中獲得一個隨機元素。我正在尋找一種獲取隨機郵件或郵編或貨幣價值的方式。

+0

比什麼更容易解決?我認爲你有一個你認爲無效的解決方案,然後發佈並讓我們看看。 :) – Chris 2011-02-03 10:12:57

回答

5

我認爲你必須劃分你的答案分爲兩部分:

首先從列表中獲取一個隨機的枚舉類型。我認爲這部分已經通過提供的其他答案解決了。

之後,您希望爲選定的枚舉創建一個隨機值列表。所以你需要一個能夠爲這些類型創建一個有效的隨機值的工廠。最接近你需求的東西應該是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; 
    } 
} 

所以,你可以爲每種類型的創建自己的來源,之後很容易創建一批樣品的對象。

1

您可以創建一個從0到枚舉項數的隨機數(您可以通過Enum.GetNames().Length得到它們),然後將該數字投射到您的LogicalTypeEnum

1

你可以用下面的代碼片段這樣做(注意:這僅僅是1個隨機值,重新用於下一個項目,隨機數生成和enumItemsCount;))

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