【发布时间】:2015-05-04 22:01:24
【问题描述】:
我将如何创建委托“动作”的迭代器。我可以将序列输入 foreach 循环并在继续下一个操作之前完成每个操作。
是否也可以在委托“动作”中支持多个收益?
public void SequenceTest()
{
List<Func<IEnumerator>> sequence = new List<Func<IEnumerator>> { () => Do(1), () => Do(2), () => Do(3) };
Play (sequence);
}
private IEnumerator Play (IList<Func<IEnumerator>> sequence)
{
foreach (Func<IEnumerator> act in sequence)
{
yield return act();
}
}
private IEnumerator Do(int num)
{
Console.WriteLine ("Starting " + num);
Console.WriteLine ("step A");
for(int i=0; i < 100; i++)
{
Console.WriteLine(".");
}
Console.WriteLine ("Ending " + num);
yield return null;
}
private IEnumerator DoMulti(int num)
{
Console.WriteLine ("Starting " + num);
Console.WriteLine ("step A");
for(int i=0; i < 100; i++)
{
Console.WriteLine("v");
}
yield return null;
Console.WriteLine ("step B");
for(int i=0; i < 100; i++)
{
Console.WriteLine(".");
}
Console.WriteLine ("Ending " + num);
yield break;
}
【问题讨论】:
-
所以基本上是一个管道?
-
功能上是的,但它也可以进一步加深我对迭代器、产量和 IEnumerators/IEnumerables 的了解。
-
状态机是软件中非常常见的抽象。是的,yield 关键字可以帮助您实现它们。然而,状态机总是连续的概念,即使它们是嵌套的,也会让你的代码以大约每小时 100 英里的速度碰壁。它无法避免,无法左右转向。