[英]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.