6

私は現在、いくつかのプロジェクトオイラーの問題を行っていますが、初期の問題には、フィボナッチ数や素数などが含まれることがよくあります。それらを繰り返すことは、少なくともコードの読みやすさと知覚される「エレガンス」において、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 に答える