2011-02-04 125 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;