Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动作迭代器_C#_Delegates_Iterator - Fatal编程技术网

C# 动作迭代器

C# 动作迭代器,c#,delegates,iterator,C#,Delegates,Iterator,如何创建委托“操作”的迭代器。在这里,我可以将序列输入到foreach循环中,并在继续下一个操作之前完成每个操作 是否也可以在委托“操作”中支持多个收益 public void SequenceTest() { 列表序列=新列表{()=>Do(1),()=>Do(2),()=>Do(3)}; 播放(序列); } 专用IEnumerator播放(IList序列) { foreach(按顺序执行函数) { 收益回报法案(); } } 私有IEnumerator Do(int num) { Conso

如何创建委托“操作”的迭代器。在这里,我可以将序列输入到foreach循环中,并在继续下一个操作之前完成每个操作

是否也可以在委托“操作”中支持多个收益

public void SequenceTest()
{
列表序列=新列表{()=>Do(1),()=>Do(2),()=>Do(3)};
播放(序列);
}
专用IEnumerator播放(IList序列)
{
foreach(按顺序执行函数)
{
收益回报法案();
}
}
私有IEnumerator Do(int num)
{
Console.WriteLine(“开始”+num);
Console.WriteLine(“步骤A”);
对于(int i=0;i<100;i++)
{
控制台写入线(“.”);
}
Console.WriteLine(“结束”+num);
收益返回空;
}
私有IEnumerator-DoMulti(int-num)
{
Console.WriteLine(“开始”+num);
Console.WriteLine(“步骤A”);
对于(int i=0;i<100;i++)
{
控制台写入线(“v”);
}
收益返回空;
Console.WriteLine(“步骤B”);
对于(int i=0;i<100;i++)
{
控制台写入线(“.”);
}
Console.WriteLine(“结束”+num);
屈服断裂;
}

您试图做的事情可以通过一个简单的扩展方法来实现

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;
    }
}
void Main()
{
IEnumerable numbers=新列表{1,2,3,4,5,6,7,8};
数字。每个(控制台。写入线);
}
公共静态类扩展
{
公共静态IEnumerable Each(此IEnumerable可枚举,操作)
{
foreach(可枚举中的var元素)
{
调用(元素);
}
返回可枚举;
}
}

那么基本上是一种管道吗?功能上是的,但这也是为了进一步了解迭代器、产量和IEnumerators/IEnumerables。状态机是软件中非常常见的抽象。是的,yield关键字帮助您实现它们。然而,即使在嵌套状态机的情况下,状态机始终是顺序的这一概念也会使您的代码以大约每小时100英里的速度运行。它无法避免它,无法向左或向右转向。这与IEnumerable基本相同。ForEach,不是吗?列表。ForEach*IEnumerable没有ForEach扩展无需担心,当我意识到它没有在IEnumerable中实现时,我也觉得很奇怪,至少这是最有意义的。谢谢你的建议,但不是真的想在一个序列上执行一个动作,而是一系列动作。我还试图让它与yield/IEnumerator一起工作。单词sequence让我想知道你指的是集合还是有序序列。。。如果只是一个集合,您仍然可以修改上面的代码,如果您指的是一个有序的序列,那么它将有助于了解您试图实现的宏伟计划
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;
    }
}