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

时间:2011-02-04 23:11:39

标签: c# linq

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

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

5 个答案:

答案 0 :(得分:10)

你可以这样做:

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

答案 1 :(得分: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));
}

答案 2 :(得分:2)

顺便说一下,我猜你在原始解决方案中没有得到你期望的结果,因为_rand.Next(100)是针对每个循环迭代进行评估的。因此列表长度在[0; 100)

答案 3 :(得分: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();

答案 4 :(得分:2)

我认为首先生成一系列数字只是为了扔掉它并不优雅。 这些方法在现场提供随机数字(你必须付出冗长的代价):

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;