假设我想要一个由10个数字组成的序列,并且我有一个按需产生数字的函数:
var s = new List<int>();
for (var i=0; i<10; i++) {
s.Add(Magically_generate_a_very_special_number());
}
是完成此操作的常用方法。但是,假设我要使用LINQ。我已经可以了(让我们忽略类型之间的区别):
var s = Enumerable.Range(0, 10).Select(i => MathNet.Numerics.Statistics.DescriptiveStatistics())
这对我几乎足够了。但是,令我困扰的是我需要首先指定整数范围-这是多余的步骤,因为无论如何我都放弃了该值。是否可以执行以下操作?
var s = Enumerable.ObjectMaker(Magically_generate_a_very_special_number).Take(10);
看来
Enumerable.Repeat
几乎可以满足我的要求,但是它会接受我给它的函数的结果,然后将其复制,而不是反复评估该函数。顺便说一下,这个问题的灵感来自Math.Net
IContinuousDistribution.Samples
方法。它的主体如下所示:while (true)
{
yield return Generate_a_random_number();
}
这样您就可以使用
myDistribution.Samples.Take
从分布中获取样本序列。原则上,我可以编写自己的方法以相同的方式生成迭代器,但是我想知道是否已经存在一个迭代器。 最佳答案
您可以尝试使用foreach方法:
Enumerable.Take(10).ToList().Foreach(Magically_generate_a_very_special_number);
缺点恕我直言,您必须在两者之间执行ToList。
编辑误读的问题,所以nvmd :)