22

両方のアプローチの利点/欠点はどれですか?

return items.Select(item => DoSomething(item));

foreach(var item in items)
{
    yield return DoSomething(item);
}

編集MSILはほぼ同等なので、どちらが読みやすいと思いますか?

4

3 に答える 3

17

このyield return手法により、C#コンパイラは「舞台裏」で列挙子クラスを生成しますが、Select呼び出しでは、デリゲートでパラメーター化された標準の列挙子クラスが使用されます。Select実際には、デリゲートの場合、場合によっては追加の呼び出しフレームを除いて、2つの間に大きな違いはありません。

価値があるのは、ラムダをラップすることDoSomethingも無意味です。代理人を直接渡すだけです。

于 2009-09-25T19:56:17.490 に答える
12

現在、私が望むよりも多くの時間を費やしている動きの遅い企業の世界では、歩留りリターンには、少なくともあと 2 年間はインストールされない真新しい .NET 3.5 フレームワークが必要ないという大きな利点があります。 .

于 2009-09-25T21:57:37.797 に答える
4

Select では、「アイテム」コレクション内の各アイテムに対して 1 つのオブジェクトのみを返すことができます。追加を使用する.Where(x => DoIReallyWantThis(x))と、不要なアイテムを取り除くことができますが、アイテムごとに 1 つのオブジェクトしか返すことができません。アイテムごとに複数のオブジェクトが必要になる可能性がある場合は、 を使用できます.SelectManyが、読みにくい 1 行の長い行に簡単に巻き込まれてしまいます。

「yield return」は、複雑なデータ構造を調べてあちこちの情報を取り出している場合に、コードを読みやすくする可能性を秘めています。私が見た最も良い例は、オブジェクトが返される結果となる約 12 の個別の条件があり、それぞれのケースで返されたオブジェクトが異なる方法で構築されていた場合です。

于 2009-09-25T20:08:44.530 に答える