5

この質問に答えた後、楽しみのために次のC#コードをまとめました。

public static IEnumerable<int> FibonacciTo(int max)
{     
    int m1 = 0;
    int m2 = 1;
    int r = 1;

    while (r <= max)
    {
       yield return r;

       r = m1 + m2;
       m1 = m2;
       m2 = r;
    }
}

foreach (int i in FibonacciTo(56).Where(n => n >= 24) )
{
   Console.WriteLine(i);
}

max問題は、関数にパラメーターを渡す必要がないことです。現在、これを使用しない場合、コードは正しいデータを出力しますが、IEnumerableが引き続き機能するため、ハングしているように見えます。このように使用できるようにするには、どうすればよいですか。

foreach (int i in Fibonacci().Where(n => n >= 24 && n <= 56) )
{
   Console.WriteLine(i);
}
4

2 に答える 2

12

SkipWhile代わりにとの組み合わせを使用する必要がありTakeWhileます。

foreach (int i in Fibonacci().SkipWhile(n => n < 24)
                             .TakeWhile(n => n <= 56))
{
   Console.WriteLine(i);
}

これらは、条件に応じてループを終了することができます。Where入力がなくなるまで(この場合は決して)、入力をストリーミングします(適切にフィルタリングします)。

于 2009-05-05T19:49:02.840 に答える
-2

独自のLINQプロバイダーを作成しない限り、これは不可能だと思います。与えた例では、LINQ to Objectsを使用しており、フィルターを適用する前にIEnumerableを完全に評価する必要があります。

于 2009-05-05T19:48:03.843 に答える