6

我目前正在做一些 Project Euler 问题,早期的问题通常涉及斐波那契数或素数等问题。对它们进行迭代似乎很适合 LINQ,至少在代码的可读性和感知“优雅”方面(我试图在可能和适用的情况下使用特定于语言的特性来感受这些语言)。

我现在的问题是,如果我只需要一组达到一定限制的数字,我应该如何最好地表达这一点?目前我已经在迭代器中对各自的限制进行了硬编码,但我真的希望枚举器返回列表,直到外部的东西决定不再查询它,因为它超过了一定的限制。所以基本上我有一个潜在的无限迭代器,但我只从中获取一组有限的数字。我知道这样的事情在函数式语言中是微不足道的,但我想知道 C# 是否也允许这样做。我唯一的另一个想法是有一个迭代器 Primes(long) ,它返回素数达到一定限制,对于其他序列也是如此。

有任何想法吗?

4

1 回答 1

10

大多数 LINQ 方法(可枚举类)都是惰性的。因此,例如,没有任何问题:

var squares = Enumerable.Range(0, Int32.MaxValue).Select(x=>x*x);

您可以使用 Take 方法来限制结果:

var 10squares = squares.Take(10);

var smallSquares = squares.TakeWhile(x => x < 10000);

编辑:您需要避免的事情是“延迟”返回但必须消耗整个可枚举来产生结果的函数。例如,分组或排序:

var oddsAndEvens = Enumerable.Range(0, Int32.MaxValue)
                             .GroupBy(x => x % 2 == 0);
foreach (var item in oddsAndEvens) {
  Console.WriteLine(item.Key);
}

(这可能会给你一个 32 位的 OutOfMemoryExeption。)

于 2009-03-30T00:45:59.007 回答