C# 使用LINQ生成填充有随机数的随机大小集合

C# 使用LINQ生成填充有随机数的随机大小集合,c#,linq,C#,Linq,我现在正在学习LINQ,我想知道是否有任何方法可以使用它来实际生成列表,而不仅仅是查询已经生成的列表。所以我有下面的代码使用for循环来生成一个int的随机大小列表,并用随机数填充它,是否有方法将其转换为LINQ var ret = new List<int>(); for (var i = 0; i < _rand.Next(100); i++) ret.Add(_rand.Next(10)); var ret=newlist(); 对于(变量i=0;i_rand.

我现在正在学习LINQ,我想知道是否有任何方法可以使用它来实际生成列表,而不仅仅是查询已经生成的列表。所以我有下面的代码使用for循环来生成一个int的随机大小列表,并用随机数填充它,是否有方法将其转换为LINQ

var ret = new List<int>();
for (var i = 0; i < _rand.Next(100); i++)
    ret.Add(_rand.Next(10));
var ret=newlist();
对于(变量i=0;i<_rand.Next(100);i++)
重新添加(_rand.Next(10));

您可以这样做:

List<int> result = Enumerable.Range(0, _rand.Next(100))
    .Select(x => _rand.Next(10))
    .ToList();
int length = _rand.Next(100);
for (var i = 0; i < length; i++)
{
    ret.Add(_rand.Next(10));
}
List result=Enumerable.Range(0,_rand.Next(100))
.选择(x=>_rand.Next(10))
.ToList();
在这里使用LINQ会带来较差的性能,我不确定它是否会提高可读性。最好是这样做:

List<int> result = Enumerable.Range(0, _rand.Next(100))
    .Select(x => _rand.Next(10))
    .ToList();
int length = _rand.Next(100);
for (var i = 0; i < length; i++)
{
    ret.Add(_rand.Next(10));
}
int length=\u rand.Next(100);
对于(变量i=0;i
您可以这样做:

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

顺便说一句,我猜在您最初的解决方案中,您并没有得到您期望的结果,因为每次循环迭代都会计算_rand.Next(100)。因此列表长度在[0;100]中的分布不均匀。

您可以使用:

var random=new random();
var list=Builder.CreateListOfSize(random.Next())
.wherell()
.haveDoneThem(x=>random.Next())
.Build();
NBuilder的优势在于,您不仅可以使用它轻松创建大型原语列表(简单),还可以轻松创建大型复杂类型列表(不那么简单):

var list=Builder.CreateListOfSize(100)
.wherell()
.haveDoneTomes(x=>x.Name=GetRandomName())
.和(x=>x.Cost=GetRandomCost())
.Build();

我认为先生成一个数字序列然后扔掉是不优雅的。 这些方法在现场提供随机数字(但您必须详细支付):


好的捕获——它还意味着其他被贴出的答案有细微的错误(如果贴出的代码是“正确”的方法;-)很好的捕获。我甚至没有想过它只是把一些东西放在一起和LINQ混在一起。谢谢。我以前试过enumerable.range,但从来没有想过在它之后做一个选择。我想我仍然有很多东西需要学习LINQ。如果你可以创建空数组
新int[\u rand.Next(100)]。选择(r=>\u rand.Next(10))。ToList()
?因为我们不需要空数组-
可枚举。范围实际上不在内部进行任何分配,它只是使用延迟执行生成一个整数范围。因为准确地说这很好,所以“return random.Next”中缺少“yield”。否则,编译器无法将int转换为IEnumerable。如果只需创建空数组
新建int[\u rand.Next(100)],为什么要创建范围。选择(r=>\u rand.Next(10)).ToList()
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 ();
let random = new Random ();
let list = Seq.init (random.Next 10) (fun _ -> random.Next 100)
           |> List.ofSeq;