5

Enumerable 内のすべてのアイテムを返す yield の標準パターンはありますか?

以下のパターンを反映したコードを見つけることがよくあります。

    public IEnumerable<object> YieldReturningFunction()
    {

        ...
        [logic and various standard yield return]
        ...

        foreach(object obj in methodReturningEnumerable(x,y,z))
        {
            yield return obj;
        }

    }

Enumerable の結果を返すためだけに foreach ループを明示的に使用すると、コードの匂いがします。

Enumerable を明示的に作成し、各標準の yield return の結果をそれに追加し、methodReturningEnumerableの結果の範囲を追加することで、明らかにコードの複雑さを増す yield return の使用を放棄できます。これは残念なことです。利回りパターンを管理するためのより良い方法が存在することを願っていたからです。

4

2 に答える 2

5

いいえ、それを回避する方法はありません。

これはリクエストされた機能であり、悪い考えではありません (yield foreachまたは同等の機能が他の言語に存在します)。

現時点では、Microsoft はそれを実装するための時間と資金を割り当てていません。彼らは将来それを実装するかもしれないし、しないかもしれません。私は(事実に基づく根拠なしに)それがやることリストのどこかにあると推測します。それは単に、実際に実装されるのに十分なリストの上位になるかどうか/いつになるかという問題です。

私が見ることができる唯一の可能な変更yield returnsは、メソッドの先頭から個々のすべてを独自の列挙可能な戻りメソッドにリファクタリングし、そのメソッドと の連結を返す新しいメソッドを追加することmethodReturningEnumerable(x,y,z)です。それは良いでしょうか。いいえ、おそらくそうではありません。それConcat以上ではないにしても、節約した分だけ戻ってきます。

于 2012-11-15T17:59:36.557 に答える
2

できません。とはいえ、それほど悪くはありません。1 行に短縮できます。

foreach (var o in otherEnumerator) yield return o;

無関係な注意: ジェネレーターに含めるロジックに注意する必要があります。GetEnumerator()返された で が呼び出されるまで、すべての実行が延期されIEnumerableます。私はNullArgumentExceptionこの方法で s を誤ってスローすることがよくあるので、言及する価値があると思いました。:)

于 2012-11-15T18:09:42.043 に答える