4

我有两个单独的操作是枚举器。

一个可以独立运行,另一个依赖第一个运行。

我虽然这样做我会很聪明:

public IEnumerator<IResult> DoStuffIndependently()
{
   yield return this;
   yield return that;
}

public IEnumerator<IResult> DoStuffBeforeSometimes()
{
   yield return AffectThis;
   yield return AffectThat;

   yield return DoStuffIndependently();
}

这不起作用,通过 foreach 也不起作用。我不想自己一步一步完成所有事情,我猜有一种非常简单的方法可以做到这一点。

4

3 回答 3

4

方法要么是迭代器块(yield return等),要么是常规方法(return等)。不能两者兼而有之。因此,要使用另一个迭代器,您必须对其进行迭代 - 即

yield return AffectThis;
yield return AffectThat;
using(var iter = DoStuffIndependently()) {
    while(iter.MoveNext()) yield return iter.Current;
}

或者,您也许可以使用将两个现有的迭代器Concat缝合在一起。

于 2012-07-18T11:22:26.633 回答
2

使用IEnumerable而不是IEnumerator应该foreach可以正常工作:

public IEnumerable<IResult> DoStuffIndependently()
{
   yield return This;
   yield return That;
}

public IEnumerable<IResult> DoStuffBeforeSometimes()
{
   yield return AffectThis;
   yield return AffectThat;
   foreach (var x in DoStuffIndependently())
        yield return x;
}

或者,按照Marc 的建议,显式调用IEnumerator.MoveNext

于 2012-07-18T11:22:48.160 回答
2

如果您希望它是 IEnumerator 而不是 IEnumerable,则必须手动遍历它:

public IEnumerator<IResult> DoStuffIndependently() {
    yield return this;
    yield return that;
}

public IEnumerator<IResult> DoStuffBeforeSometimes() {
    yield return AffectThis;
    yield return AffectThat;

    var dsi = DoStuffIndependently();
    while (dsi.MoveNext()) yield return dsi.Current;
}
于 2012-07-18T11:25:29.637 回答