4

列挙子である2つの別々のアクションがあります。

1つは独立して実行でき、もう1つは後で最初に実行することに依存します。

私はこれを行うことで本当に賢くなりますが:

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

メソッドは、イテレータブロック(など)、xまたは通常のメソッド(など)のいずれかです。両方にすることはできません。そのため、別のイテレータを使用するには、それを反復する必要があります。yield returnreturn

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

または、2つの既存のイテレータ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

IEnumerableではなくIEnumeratorにしたい場合は、手動で繰り返す必要があります。

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 に答える