3

methodA を呼び出してから methodB を呼び出すと、出力は "121234" になります。しかし、メソッドAからの「1234」、「12」、およびメソッドBからの「34」という出力が必要です。getNumber が返された場所を覚えておく必要があり、次の呼び出しはここから続行されます。可能です?

MethodA スニップセット

int x = 0;
foreach (var num in GetNumber())
{
    if (x == 2)
    {
        break;
    }
    x++;
    Console.Write(num);
}

MethodB スニップセット

int x = 0;
foreach (var num in GetNumber())
{
    if (x == 4)
    {
        break;
    }
    x++;
    Console.Write(num);
}

GetNumber

static IEnumerable<int> GetNumber()
{
    int x = 0;
    while (true)
    {
        yield return x++;
    }
}
4

2 に答える 2

4

xメソッドの外で初期化できます。

static class InfiniteContinuingSequence
{
    static int x = 0;

    public static IEnumerable<int> GetNumbers()
    {
        while (true)
        {
            yield return x++;
        }
    }
}

ただし、このシーケンスが列挙されるタイミングと場所には、明示的に注意する必要があります。誤って複数回列挙された場合、シーケンス内の数字が「失われます」。徹底的に列挙しようとするとGetNumbers()、無限ループまたはオーバーフローが発生します。ロックせずに複数のスレッドからこれを呼び出そうとすると、奇妙な動作が発生する可能性があります。


代わりに、明示的な列挙子を使用するか、メソッドに「再起動ポイント」を指定できるようにすることをお勧めします (この場合、少なくとも複数の列挙によって奇妙な動作が発生することはありません)。

static IEnumerable<int> GetNumbers(int startingPoint = 0)
{
    int x = startingPoint;
    while (true)
    {
        yield return x++;
    }
}
于 2013-12-24T00:33:49.503 に答える
0

GetNumberに変更

static int x = 0;
static IEnumberable<int> GetNumber()
{
   while (true) { yield return x++; }
}

問題は、GetNumber の列挙が 2 つあることです。静的にすることxで、必要な結果が得られます。thread safeただし、これはコードではないことに注意してください。

于 2013-12-24T00:35:24.667 に答える