【发布时间】:2013-12-24 14:01:44
【问题描述】:
假设我想要一个由 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 的分布中获取样本序列。原则上,我可以编写自己的方法来以相同的方式生成迭代器,但我想知道是否已经存在一个。
【问题讨论】:
-
我在这里可能真的不合时宜,但恕我直言,LINQ 的目的是减少代码行数并根据某些条件从可枚举中选择某些元素。它并不是真的打算创建新对象。
-
不,这是一个完全合理的评论。然而,对我来说,在某些情况下,LINQ 更容易阅读(在我自己的个人项目中)。