2

私はそれが不可能で無意味であることをほとんど知っていますが、ただ学ぼうとしています..

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

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

2 つを組み合わせて 1 つの方法を形成できますか? 1 つのメソッドに 2 つの異なるイテレータ ブロックを配置できますか?

編集:手元にある問題を解決する方法を尋ねているのではありません。私は何か新しいことを学ぼうとしているので、より大きな問題は「2 つの別々のブロックを 1 つの関数で動作させる方法はあるのか」ということです。C# には匿名型とクロージャがあり、名前付きの型やメソッドを使用せずに、メソッド自体の内部で何か新しいものを定義できるためです。ブロックも同様?

4

2 に答える 2

3

yieldつまり、いいえ、同じメソッド内でイテレータをネストすることはできません。

yieldメソッドレベルでコンパイルされます。実行するたびyield returnにメソッドが終了し、後で中断したところから続行します。これは、yieldステートメントをネストした場合でも、ブロック レベルではなくメソッド レベルで動作することを意味します。

于 2013-02-09T21:42:09.857 に答える
1

あなたが求めているのは、無名イテレータ ブロックです。Eric Lippertがこの件について少し前にブログを書いています。要するに、彼はそれが素晴らしい機能であり、ぜひ見たいと述べましたが、そのような機能を実際に実装することは非常に困難であるため、これまでのところ言語に追加されていません (将来的に追加する予定はありません)。可能性は低い)。

于 2013-02-09T23:07:21.400 に答える