gpt4 book ai didi

C# yield 跟进到最后

转载 作者:行者123 更新时间:2023-11-30 15:31:20 26 4
gpt4 key购买 nike

如果我调用方法 A,然后调用方法 B,输出为:“121234”。但我需要输出:方法 A 的“1234”、“12”和方法 B 的“34”。我需要记住 getNumber 在哪里以返回结束,下一个调用从这里继续。有可能的?

方法A片段集

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

获取数字

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

关于C# yield 跟进到最后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com