如何在第一个中激活另一个枚举器

时间:2012-07-18 11:14:24

标签: c# iterator enumerable yield-return

我有两个独立的行动,即调查员。

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

我虽然这样做会非常聪明:

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

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

   yield return DoStuffIndependently();
}

这不起作用,也通过foreach也不起作用。我不想自己介绍一切,我猜这有一个非常简单的方法。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

使用IEnumerable代替IEnumeratorforeach应该可以正常使用:

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;
}

或者,请IEnumerator.MoveNext明确致电Marc suggested

答案 2 :(得分: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;
}