有没有办法可以将两个独立的迭代器块组合成一个?

时间:2013-02-09 21:21:38

标签: c# iterator refactoring ienumerable yield-return

我几乎知道它不可能和毫无意义,但只是想学习......我有:

public IEnumerable<IEnumerable<object>> GetMany()
{
    while (someCondition)
        yield return GetFew();
}

static IEnumerable<object> GetFew()
{
    while (someOtherCondition)
        yield return new object();
}

我可以将两者结合起来形成一种方法吗?两个不同的迭代器块可以放在一个方法中吗?

编辑:我不是在问如何解决我手边的问题。我正在尝试学习新东西,所以更大的问题是“有两种方法可以在一个函数中使用两个独立的块”吗?我问,因为在C#中有匿名类型和闭包,你可以在没有命名类型或方法的情况下在方法本身内定义新的东西。同样对于块?

2 个答案:

答案 0 :(得分:3)

简而言之,不,你不能在同一个方法中嵌套yield迭代器。

yield是在方法级别编译的。每次执行yield return时,它都将退出该方法,然后在中断的位置继续。这意味着如果嵌套yield语句,它们仍将以方法级别运行,而不是块级别。

答案 1 :(得分:1)

您要求的是匿名迭代器块。 Eric Lippert blogged on the subject一会儿回来。简而言之,他说这将是一个很好的功能,他很乐意看到,但实际实现这样一个功能是非常困难的,所以到目前为止还没有添加到语言中(并且将来添加它是不太可能)。