假设我想要一个由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 :)

10-08 02:16