我正在学习LINQ,我想知道是否有任何方法可以使用它来实际生成列表,而不仅仅是查询已经生成的列表。所以我有以下代码使用for循环来获得一个随机大小的整数列表并用随机数填充它,是否还有将其转换为LINQ?
var ret = new List<int>();
for (var i = 0; i < _rand.Next(100); i++)
ret.Add(_rand.Next(10));
答案 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;