c# - 在(通过转换为状态机)递归生成器方法中摆脱 'yield' 的最简单方法?

标签 c# state-machine yield-return

我写了一段漂亮、优雅的 (IMO) 代码,我想移植到其他语言,如 C++、Java 等。

我面临的问题是双重的:

  • 代码使用yield
  • 代码是高度递归的

手动摆脱 yield可能,但非常乏味 -- 这个过程非常机械,显然可以自动化。
同时,C# 编译器将其转换成的状态机非常难看 -- 它实际上无法用于移植。 (我试过反编译它;它只是不可读。)

我想知道,除了花几天时间手动摆脱 yield 之外,我还有其他选择吗?
或者是否有某种工具可以将 yield block 转换为(可读)状态机,然后我可以像普通代码一样移植它?


如果您对我所说的“高度递归”是什么意思感到好奇——下面的代码基本上是代码的结构(实际只有 ~66 行;它不是一个非常长的函数):

static IEnumerable<ReturnType> MyRecursiveYielder(args)
{
    if (blah1) yield return foo;
    else if (blah2)
        foreach (var foo1 in foo2.Blah())
            foreach (var item in MyRecursiveYielder(moreArgs))
                yield return item;
    else
    {
        var state = new State();
        foreach (var item in blah)
            foreach (var item2 in MyRecursiveYielder(otherArgs))
                foreach (var item3 in blah3)
                {
                    foreach (var result in MyRecursiveYielder(yetMoreArgs)))
                        yield return result;
                    foobar1();
                }
        while (condition)
            foreach (var foo in blah)
                foreach (var result in MyRecursiveYielder(argh)))
                {
                    if (condition2)
                        foreach (var result in MyRecursiveYielder(almostThere)))
                            yield return result;
                    foobar2();
                }
    }
}

最佳答案

yield 完成的工作接近协程。您应该能够移植到支持这些语言的语言。不幸的是,很少有语言这样做。我相信 Ada 拥有它们。

下一步是纤维。 Win32 API 公开纤程,因此对于 C++,这可能是一个选项。我认为不适用于 Java。

因此,简短的回答:调查您的目标平台的协程或纤程的可用性。

关于c# - 在(通过转换为状态机)递归生成器方法中摆脱 'yield' 的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13008295/

相关文章:

javascript - 在 JavaScript 中创建一个基本的公式编辑器

c# - IEnumerable 表达式体成员 C#

c# - 无法将类型为 '<>d__6' 的对象转换为类型 'System.Object[]'

c# - XML DataTemplate 绑定(bind)多层用户控件

javascript - 如何使用非递归堆栈编写递归函数?

c# - 如何根据 BrokeredMessage 类的内置属性过滤 ServiceBus 主题订阅?

java - 如何编写 lwuit 单选按钮代码

c# - 复制 IEnumerable,替换一个项目

c# - Microsoft asp c# RegEx 转义多个保留字符

c# - 如何在 C# 中执行 typeof object[*]?