3

如果我调用 methodA 然后 methodB 输出是:“121234”。但我需要输出:来自methodA的“1234”、“12”和来自methodB的“34”。我需要记住 getNumber 以返回结束的位置,并且下一个调用从这里继续。有可能的?

方法片段

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

方法 B 片段

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

获取号码

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 枚举。通过制作x静态,您将获得所需的结果。但请注意,这不是thread safe代码。

于 2013-12-24T00:35:24.667 回答