我在学习LINQ,我想知道是否有任何方法可以用它来实际生成列表,而不仅仅是查询已经生成的列表。所以我有下面的代码使用for循环来获得随机大小的整数列表并填充随机数字,是否有将它转换为LINQ?使用LINQ生成一个随机数的随机大小集合
var ret = new List<int>();
for (var i = 0; i < _rand.Next(100); i++)
ret.Add(_rand.Next(10));
我在学习LINQ,我想知道是否有任何方法可以用它来实际生成列表,而不仅仅是查询已经生成的列表。所以我有下面的代码使用for循环来获得随机大小的整数列表并填充随机数字,是否有将它转换为LINQ?使用LINQ生成一个随机数的随机大小集合
var ret = new List<int>();
for (var i = 0; i < _rand.Next(100); i++)
ret.Add(_rand.Next(10));
你可以这样做:
Random _rand = new Random();
var results = Enumerable.Range(0, _rand.Next(100))
.Select(r => _rand.Next(10))
.ToList();
你可以做这样的:
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));
}
为什么,如果你可以创建范围只需创建空数组`new int [_rand.Next(100)]。选择(r => _rand.Next(10))。ToList()`? – Necronomicron 2018-03-06 22:41:59
顺便说一句,我想在你原来的解决方案,你没有得到你期待什么,因为_rand。接下来(100)针对每个循环迭代进行评估。所以列表长度在[0; 100)
您可以使用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();
我认为这是不优雅首先生成一个数字序列只把它扔掉。 这些方法当场交付随机数(你虽然有冗长支付):
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;
谢谢。我试过enumerable.range之前,但从来没有想过要做一个选择后。猜猜我还有很多要学习LINQ。 – Sathariel 2011-02-05 00:23:02
为什么创建Range只需创建空数组`new int [_rand.Next(100)]。Select(r => _rand.Next(10))。ToList()`? – Necronomicron 2018-03-06 22:40:24
因为我们不需要一个空数组 - 实际上`Enumerable.Range`没有在内部做任何分配,它只是使用延迟执行生成一个整数范围 – BrokenGlass 2018-03-07 00:00:54