繁体   English   中英

C#yield后续到底

[英]C# yield Follow-up to the end

如果我调用methodA然后methodB输出是:“121234”。 但我需要输出:方法A中的“1234”,“12”和方法B中的“34”。 我需要记住getNumber在返回时的结束位置,下一次调用将从此处继续。 有可能的?

MethodA snipset

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

MethodB snipset

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++;
    }
}

您可以在方法外初始化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++;
    }
}

GetNumber更改为

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

问题是您有两个GetNumber枚举。 通过使x静态,您将获得所需的结果。 但要注意这不是thread safe代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM