【问题标题】:Action Iterator动作迭代器
【发布时间】: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 英里的速度碰壁。它无法避免,无法左右转向。

标签: c# delegates iterator


【解决方案1】:

你想要做的事情可以通过一个简单的扩展方法来实现……

void Main()
{
    IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
    numbers.Each(Console.WriteLine);
}

public static class Extensions 
{
    public static IEnumerable<T> Each<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach (var element in enumerable)
        {
            action.Invoke(element);
        }

        return enumerable;
    }
}

【讨论】:

  • 这和IEnumerable.ForEach基本一样吧?
  • List.ForEach* IEnumerable 没有 ForEach 扩展
  • 不用担心,当我意识到它没有在 IEnumerable 中实现时,我也觉得这很奇怪,至少这是最有意义的。
  • 感谢您的建议,但不是真的想对序列执行单个操作,而是执行一系列操作。此外,我正在尝试使其与 yield/IEnumerator 一起使用。
  • sequence 这个词让我想知道你是指一个集合还是一个有序序列......如果只是一个集合,你仍然可以适应上面的代码,如果你的意思是一个有序的序列,这将有助于听到你试图在宏伟的计划中实现的目标
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2015-05-20
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2018-05-16
相关资源
最近更新 更多