2009-03-30 11 views
6

現在、私はいくつかのプロジェクトオイラーの問題を抱えています。以前のものでは、フィボナッチ数や素数などの問題が頻繁に発生します。それらを反復することは、少なくとも可読性とコードの "エレガンス"を感じる(私は可能な限り言語特有の機能を使用しようとしていて、言語の感触を得るために)LINQに自然に適合しているようです。無限リストのLINQクエリ

私の問題は今、ある制限まで数字のセットが必要な場合はどうすればいいですか?現在、私はイテレータのそれぞれの制限をハードコードしていますが、特定の制限を超えているため、外部の何かがそれ以上クエリを実行しないようにするまで、リストを返すようにしたいと思います。だから、基本的に無限の反復子を使う可能性がありますが、私はそこから有限の数の数字しか取っていません。私はそのようなことが関数型言語では些細なことを知っていますが、C#でもそれが許されているのだろうかと思います。私が持っていた唯一の他のアイデアは、素数をある制限まで返すイテレータPrime(long)を他のシーケンスと同じように持つことです。

アイデア?

答えて

10

ほとんどのLINQメソッド(Enumerableクラス)は遅延です。だから、例えば、何も問題はありません。

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

あなたは結果を制限するために取るメソッドを使用することができます。

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を与えるでしょう。)

+0

ああ、[OK]を、これまでのTakeWhileを知りませんでした。私はちょうど、LINQが数字が増えているとは考えていないので、希望する数字を選択する場所を使用するとうまくいかないと思っていました。それは本当にいいね。:) – Joey

+0

+1、素敵な要約。私もこのトピックについて少し詳しく説明しようとしました:http://blog.casualdev.net/2009/10/linq-and-infinite-enumerations.html –