2011-02-04 81 views
4

我在學習LINQ,我想知道是否有任何方法可以用它來實際生成列表,而不僅僅是查詢已經生成的列表。所以我有下面的代碼使用for循環來獲得隨機大小的整數列表並填充隨機數字,是否有將它轉換爲LINQ?使用LINQ生成一個隨機數的隨機大小集合

var ret = new List<int>(); 
for (var i = 0; i < _rand.Next(100); i++) 
    ret.Add(_rand.Next(10)); 

回答

7

你可以這樣做:

Random _rand = new Random(); 
var results = Enumerable.Range(0, _rand.Next(100)) 
         .Select(r => _rand.Next(10)) 
         .ToList(); 
+0

謝謝。我試過enumerable.range之前,但從來沒有想過要做一個選擇後。猜猜我還有很多要學習LINQ。 – Sathariel 2011-02-05 00:23:02

+0

爲什麼創建Range只需創建空數組`new int [_rand.Next(100)]。Select(r => _rand.Next(10))。ToList()`? – Necronomicron 2018-03-06 22:40:24

+0

因爲我們不需要一個空數組 - 實際上`Enumerable.Range`沒有在內部做任何分配,它只是使用延遲執行生成一個整數範圍 – BrokenGlass 2018-03-07 00:00:54

3

你可以做這樣的:

List<int> result = Enumerable.Range(0, _rand.Next(100)) 
    .Select(x => _rand.Next(10)) 
    .ToList(); 

使用LINQ這裏會給出較差的性能,我不知道,要麼提高了可讀性。這可能是最好做這樣的:

int length = _rand.Next(100); 
for (var i = 0; i < length; i++) 
{ 
    ret.Add(_rand.Next(10)); 
} 
+0

爲什麼,如果你可以創建範圍只需創建空數組`new int [_rand.Next(100)]。選擇(r => _rand.Next(10))。ToList()`? – Necronomicron 2018-03-06 22:41:59

2

順便說一句,我想在你原來的解決方案,你沒有得到你期待什麼,因爲_rand。接下來(100)針對每個循環迭代進行評估。所以列表長度在[0; 100)

2

您可以使用NBuilder

var random = new Random(); 
var list = Builder<int>.CreateListOfSize(random.Next()) 
         .WhereAll() 
         .HaveDoneToThem(x => random.Next()) 
         .Build(); 

NBuilder的好處是,你可以用它不僅可以輕鬆地創建的圖元的大名單(簡單),也可以輕鬆地創建複雜的大名單類型(不能算小):

var list = Builder<Product>.CreateListOfSize(100) 
          .WhereAll() 
          .HaveDoneToThem(x => x.Name = GetRandomName()) 
          .And(x => x.Cost = GetRandomCost()) 
          .Build(); 
1

我認爲這是不優雅首先生成一個數字序列只把它扔掉。 這些方法當場交付隨機數(你雖然有冗長支付):

IEnumerable<int> GetRandomSequence(int maxNumber) 
{ 
    var random = new Random(); 
    while (true) 
     yield return random.Next(maxNumber); 
} 

IEnumerable<int> GetRandomSequence(int maxNumber, int maxCount) 
{ 
    return GetRandomSequence(maxNumber).Take(maxCount); 
} 

var random = new Random(); 
var list = GetRandomSequence(100, 10).ToList(); 

我愛我怎麼能寫相同的F#:

let random = new Random(); 
let list = Seq.init (random.Next 10) (fun _ -> random.Next 100) 
      |> List.ofSeq;